实验-> 脏读现象 查看隔离级别 show variables like 'tx_iso%'; 修改隔离级别 mysql> set tx_isolation='READ-UNCOMMITTED'; 注意 :READ-UNCOMMITTED是字符串,如果不使用双引号,就会报错,错误信息如下: set tx_isolation=READ-UNCOMMITTED; ERROR 1064 (42000): You syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'READ-UNCOMMITTED
隔离级别分为4种: 读未提交:READ-UNCOMMITTED 读已提交:READ-COMMITTED 可重复读:REPEATABLE-READ 串行:SERIALIZABLE 上面4中隔离级别越来越强 =READ-UNCOMMITTED 以管理员身份打开cmd窗口,重启mysql,如下: C:\Windows\system32>net stop mysql mysql 服务正在停止.. mysql READ-UNCOMMITTED:读未提交 将隔离级别置为READ-UNCOMMITTED: # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ 可重复读,SERIALIZABLE串行 transaction-isolation=READ-UNCOMMITTED 重启mysql: C:\Windows\system32>net stop mysql 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLE-READ可重复读,SERIALIZABLE
事务隔离级别 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读; READ-COMMITTED 隔离级别 脏读 不可重复读 幻影读 READ-UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE-READ × × √ SERIALIZABLE × ×
读未提交:READ-UNCOMMITTED 2. 读已提交:READ-COMMITTED 3. 可重复读:REPEATABLE-READ 4. ---+ 1 row in set, 1 warning (0.00 sec) 隔离级别的设置 分2步骤,修改⽂件、重启mysql,如下: 修改mysql中的my.init⽂件,我们将隔离级别设置为:READ-UNCOMMITTED ,如下: # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE串⾏ transaction-isolation =READ-UNCOMMITTED 以管理员⾝份打开cmd窗⼜,重启mysql,如下: C:\Windows\system32>net stop mysql mysql 服务正在停⽌.. mysql 服务已成功停 :读未提交情况下,可以读取到其他事务还未提交的数据,多次读取结果不⼀样,出 现了脏读、不可重复读 READ-COMMITTED:读已提交 将隔离级别置为READ-COMMITTED # 隔离级别设置,READ-UNCOMMITTED
注:MySQL中查看、设置事务隔离级别: #查看事务隔离级别 SELECT @@tx_isolation; #设置隔离级别为read-uncommitted set tx_isolation='read-uncommitted AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; 脏读 开启2个数据库session,session1执行 #设置为读未提交 set tx_isolation='read-uncommitted 这时,在session2中读取数据: #设置为读未提交 set tx_isolation='read-uncommitted'; SELECT * from `account`; 不可重复读 初始化数据
MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的,在文件的最后添加:transaction-isolation = REPEATABLE-READ可用的配置值:READ-UNCOMMITTED READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
事务隔离级别共四种,隔离的程度由低至高就是:1)READ-UNCOMMITTED(读取未提交内容)级别 2)READ-COMMITTED(读取提交内容)级别 3)REPEATABLE-READ(可重读)
session.tx_isolation; +------------------------+ | @@session.tx_isolation | +------------------------+ | READ-UNCOMMITTED session.tx_isolation; +------------------------+ | @@session.tx_isolation | +------------------------+ | READ-UNCOMMITTED session.tx_isolation; +------------------------+ | @@session.tx_isolation | +------------------------+ | READ-UNCOMMITTED ------------+ 1 row in set (0.00 sec) 我们使用不含session和global的语句将隔离级别改成了read committed,再次查看,看到的结果是read-uncommitted
REPEATABLE-READ:可重复读 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD 将隔离级别置为REPEATABLE-READ # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE 将隔离级别置为SERIALIZABLE # 隔离级别设置,READ-UNCOMMITTED读未提交,READ-COMMITTED读已提交,REPEATABLEREAD可重复读,SERIALIZABLE串
实战分析 读未提交 客户端A set tx_isolation=' read-uncommitted '; start transaction; 客户端B set tx_isolation=' read-uncommitted
在SQL标准中定义了四种事务的隔离级别,它们分别是:读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)、可重复读(REPEATABLE-READ)和可序列化读(SERIALIZABLE 达梦数据库支持三种事务隔离级别:读未提交(READ-UNCOMMITTED)、读提交(READ-COMMITTED)和串行化(SERIALIZABLE)。
读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别,如果发现记录不匹配 where 条件,会及时释放行锁。这又分为两种情况。 3. prepare 阶段 读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别下: select、update、delete 语句全表扫描、索引范围扫描过程中 事物加的所有行锁,除了读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别已经释放的不匹配 where 条件的记录上的行锁、索引记录前面间隙的锁定之外,剩下的行锁 读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)两种隔离级别,事务加的行锁,释放时机不同。
马克-to-win:其中窗口1我通过set session transaction isolation level read uncommitted; 命令可以把它变成READ-UNCOMMITTED级别
----------------------+-----------------+1 row in set, 2 warnings (0.01 sec) 下面用例子说明一下这四种隔离级别: 1. read-uncommitted 更改隔离级别为read-uncommitted: mysql> set session tx_isolation='read-uncommitted'; Query OK, 0 rows affected sec) mysql> select @@tx_isolation; +------------------+| @@tx_isolation | +------------------+| READ-UNCOMMITTED
transaction-isolation = REPEATABLE-READ transaction-isolation = READ-COMMITTED transaction-isolation = READ-UNCOMMITTED
tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ set tx_isolation='隔离级别'; --read-uncommitted read-committed repeatable-read serializable set tx_isolation='read-uncommitted'; select @@ tx_isolation; +------------------+ | @@tx_isolation | +------------------+ | READ-UNCOMMITTED | +--
– 打开客户端A,设置读未提交的隔离级别,查询表test01的值 mysql> set session tx_isolation=‘READ-UNCOMMITTED’; mysql> select @@ tx_isolation; ±-----------------+ | @@tx_isolation | ±-----------------+ | READ-UNCOMMITTED | ±------ lisi | | 3 | wangmin | ±-----±---------+ – 打开客户端B,更新表test01,先不要提交 mysql> set session tx_isolation=‘READ-UNCOMMITTED ’; mysql> select @@tx_isolation; ±-----------------+ | @@tx_isolation | ±-----------------+ | READ-UNCOMMITTED
时设置全局变量执行成功,但不生效(当前兼容命令可以执行): ignoreXaRu 参数说明: Property Value 参数值 ignoreXaRu 是否可见 否 参数说明 设置为true时忽略XA模式下READ-UNCOMMITTED -- 设置为true时忽略XA模式下READ-UNCOMMITTED隔离级别的设置报错, 默认为false(Ignore unsupported error message of READ-UNCOMMITTED mode when the parameter is set to true, default is false) --> 参数作用: ignoreXaRu默认为false,设置为true时忽略XA模式下READ-UNCOMMITTED
SELECT @@autocommit; SELECT @@session.tx_isolation; 为某个会话变量赋值 (session可省略) SET @@session.tx_isolation='read-uncommitted
事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 读未提交(read-uncommitted) 否 是 是 可重复读(repeatable-read) 否