mysql 事务隔离级别
- 读未提交:事务A修改了t 表字段 k =2,未提交事务,事务B 查询 表t ,查询到k值为2,在该事务隔离状态下,事务B获取到的k值为修改后的值
- 读提交:事务A 修改t表字段k=2,原值为1 未提交事务,事务B查询表t,查询到k 值为1,事务A 提交事务,此时事务B查询k值为2
- 可重复读:事务A 开启事务时刻 t a1 ,修改t表字段 k=2 时刻t a2 ,提交事务 t a3 ,事务B 在ta1 时刻开始事务,查询t表,此时字段值为1,ta3时刻查询 字段k 值为1, 事务B 提交事务 再次查询表t k值为2
- 串行化:事务A 在执行事务的时候,会加锁,直到事务提交,当出现读写冲突时候,事务B将在A提交后执行
分析
分析在“可重复读”事务隔离机制下,此时A 事务查询的k的值和事务B查询的值
1.首先A 开始事务,在可重复读事务隔离机制下,start transaction 将会创建一个视图(注意只有 start transaction withconstent snapshot 才会在事务一开始创建视图)
2.紧接着事务B也开启事务,将会创建一个视图
3.事务C 此时更新k值,默认会开启一个事务,更新完成后会提交
4.此时事务B 开始更新k的,注意 更新语句遵从一个原则-当前读(更新语句先读后写,而这个读只能读当前值,并不是读取事务开始创建的视图里面的值)更新后此时值为3
5. 事务B开始查询k值,在一个事务内,能看到自身更新后的值,所以查询后的值k为3
6. 事务A查询k值,由于是在可重复读事务隔离机制下,查询得到的值为1,事务提交
7. 事务B提交
所以 最后结果为B查询得到的k值为3 A查询到的值为1