【Mysql】:通过例子理解事务的4中隔离级别
SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 首先,我们使用test数据库,新建tx表,并且如图所示打开两个窗口来操作同一个数据库:第1级别:ReadUncommitted(读取未提交内容)(1)所有事务都可以看到其他未提交事务的执行结果(2)本隔离级别很少用于实际应用,
SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。
低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
首先,我们使用 test 数据库,新建 tx 表,并且如图所示打开两个窗口来操作同一个数据库:

第1级别:Read Uncommitted(读取未提交内容)
(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据
#首先,修改隔离级别 set tx_isolation='READ-UNCOMMITTED'; select @@tx_isolation;+------------------+ | @@tx_isolation | +------------------+ | READ-UNCOMMITTED | +------------------+#事务A:启动一个事务start transaction;select * from tx;+------+------+ | id | num | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#事务B:也启动一个事务(那么两个事务交叉了) 在事务B中执行更新语句,且不提交start transaction; update tx set num=10 where id=1; select * from tx;+------+------+ | id | num | +------+------+ | 1 | 10 | | 2 | 2 | | 3 | 3 | +------+------+ #事务A:那么这时候事务A能看到这个更新了的数据吗?select * from tx;+------+------+ | id | num | +------+------+| 1 | 10 | --->可以看到!说明我们读到了事务B还没有提交的数据| 2 | 2 | | 3 | 3 | +------+------+#事务B:事务B回滚,仍然未提交rollback;select * from tx;+------+------+ | id | num | +------+------+ | 1 | 1 | | 2 | 2 | | 3 | 3 | +------+------+#事务A:在事务A里面看到的也是B没有提交的数据select * from tx;+------+------+ | id | num | +------+------+ | 1 | 1 | --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到!| 2 | 2 | | 3 | 3 | +------+------+
第2级别:Read Committed(
原创不易,完成人机校验,阅读全文