首页 > 数据库技术 > 详细

数据库(1)-事物的隔离级别

时间:2018-10-30 19:15:01      阅读:187      评论:0      收藏:0      [点我收藏+]

定义

事物是需要保持一致性的一批语句的集合,一个事物中的语句执行需要一定的时间,在此时间内对待外部变化的策略就是隔离级别.

事物的隔离级别有四种:读未提交,读已提交,可重复读,串行化.
安全性依次提高,性能依次下降.


1.读未提交

当事物隔离级别被设置为读未提交时,在此事物期间,外部事物未提交的更新可以被读取到.
所以会发生脏读.

  • 事物A
set tx_isolation=‘READ-UNCOMMITTED‘;
start TRANSACTION;
  • 事物B
start TRANSACTION;
update tx set num=10 where id=1;
  • 事物A
select * from tx;

结果:

1   40
2   2
3   3
4   4

2.读已提交

当事物隔离级别被设置为读已提交时,在此事物期间,外部事物已提交的更新可以被读取到.
如果外部事物有多个更新提交,那么每次读到的结果会有不同,即不可重复读.

  • 事物A
set tx_isolation=‘READ-COMMITTED‘;
start TRANSACTION;
  • 事物B
start TRANSACTION;
update tx set num=20 where id=1;
commit;
  • 事物A
select * from tx;

结果:

1   20
2   2
3   3
4   4

3.可重复读

当事物隔离级别设置为可重复读时,在此事物期间,只可以读取到事物开始前的最终状态,外部事物发生更新一律不被识别.但外部事物发生插入时,会被读取到,即为幻读.

mysql已经通过并发控制,解决了幻读的问题.
可重复读是mysql默认的隔离级别.

  • 事物A
set tx_isolation=‘repeatable-read‘;
start TRANSACTION;
  • 事物B
start TRANSACTION;
update tx set num=40 where id=1;
commit;
  • 事物A
select * from tx;

结果:

1   30
2   2
3   3
4   4

4.串行化

当隔离级别设置为串行化时,在此事物期间,外部事物不能进行插入或更新操作.从而避免了幻读的问题.

  • 事物A
set tx_isolation=‘serializable‘;
start TRANSACTION;
select * from tx;
  • 事物B
start TRANSACTION;
insert tx values(‘5‘,‘5‘);

结果:

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

数据库(1)-事物的隔离级别

原文:https://www.cnblogs.com/guan-li/p/9878775.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!