翼度科技»论坛 编程开发 mysql 查看内容

数据库事务隔离级别

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
标准隔离级别

读未提交、读已提交、可重复读、串行化串行化

对事务中所有读写的数据加上读锁、写锁、范围锁。所以冲突的事务必须同步执行。
  1. //console1
  2. start transaction ;
  3. select * from transaction_test where `key`=1;
  4. update transaction_test set name='newTest' where `key`=1;
  5. //console2
  6. start transaction ;
  7. select * from transaction_test where `key`=1;(由于事务1没有释放写锁,所以这里的查询会阻塞
  8. 如果等待时间过长,会报如下的错误;如果事务1只是查询,那么事务2也可以查询)
  9. [40001][1205] Lock wait timeout exceeded; try restarting transaction
  10. //console1
  11. commit ;(提交完之后如果事务2没有等待超时,那么会立即执行)
  12. //console2;
  13. commit ;
复制代码
可重复读

核心是只对事务中所有读写的数据加上读锁、写锁,不加范围锁。相比于读已提交,由于对整个事务都加上了读锁,避免其他事务可以进行更新,进而保证同一个事务多次读到的数据都是没有被修改过的数据。
  1. ----避免可重复读----
  2. name初始值为init
  3. //console1
  4. start transaction ;
  5. select * from transaction_test where `key`=1;(查询结果是init)
  6. //console2
  7. start transaction ;
  8. update transaction_test set name='test' where `key`=1;
  9. (理论上,由于事务1已经获取了读锁,事务2这里添加写锁应该是添加不上的,应该是阻塞中才对;
  10. 但是,实操发现,执行成功了,且在事务2中通过下面这个语句查询是test,这应该也是mvcc导致的
  11. select * from transaction_test where `key`=1;
  12. //console1
  13. select * from transaction_test where `key`=1;
  14. console1的第2次查询,查询结果和第一次一样,还是init
  15. 另外,事务2都获得写锁了,怎么能允许你事务1再去获得读锁
  16. commit ;
  17. //console2
  18. commit ;
复制代码
相比于串行化,由于没有加范围锁,会引发一种叫幻读的情况所谓幻读是指在同一个事务中,第一次查询id

举报 回复 使用道具