事务

事务

本地事务 acid

atomicity原子性:一组操作,要么全部成功,要么全部失败,不存在中间的情况 。

consistency一致性:不管事务的结果是成功还是失败,最终的结果时一致的。

isolation隔离性:在并发访问资源的时候,不同的事务之间不会相互影响。事务之间是隔离的。

duability持久性。一个事务一旦执行成功,结果会被持久化,不会改变。

事务隔离性:

脏读:一个事务读取了另一个事务未提交的数据。解决方法(read commited)

不可重复读:一个事务内两次读取的结果不一样。(update)解决方法(repeatable-read)

幻读(虚读):一个事务内两次读取的表的记录数不一样。(insert)解决方法(serializable)更新丢失:一个事务修改的值,被另一个事务所覆盖。解决方法:乐观锁和悲观锁

脏读现象

事务1开启事务,并且查询id=3的age的初始值。

zangdu1.png

事务2,隔离级别设置为:读未提交,查询id=3的age的初始值

zangdu2.png

事务1修改id=3的age的值为2,但不提交

zangdu3.png

事务2,查询id=3的age的值,结果时读到了事务1修改后的值

zangdu4.png

事务1回滚

zangdu5.png

这时候事务2读到的是age=2就是无效的。这种现象就是脏读。

不可重复读:

事务隔离级别为读未提交和读已提交都会导致不可重复读。

先说读未提交,基于以上,可以看出事务2在同一个事务内,两次读取的值不一样,这就是不可重复读。

读已提交的情况:事务1

norepeated1.png

事务2 设置事务隔离级别为读已提交

norepeat2.png

事务1修改id=3的age的值

norepeat3.png

事务2查询id=3的age的值

norepeat4.png

事务1commit

norepeat5.png

事务2查询id=3的age的值

norepeat6.png

这就是不可重复读,同一个事务里两次读取的不一样。

幻读(虚读)主要针对查询条数(insert)事务1

huandu1.png

事务2


huandu1.png

事务1开始事务,插入一条


huandu2.png

事务2查询


xudu3.png

这就是幻读,同一个事务中两次读取的条数不一样。

丢失更新:事务1

updatelost.png

事务2


updatelost.png

事务1更新id=1的name为bob


updatelost1.png

事务2更新id=1的age为12;


updatelost2.png

事务1修改的数据被事务2覆盖,这就是丢失更新问题。

你可能感兴趣的:(事务)