事务
本地事务 acid
atomicity原子性:一组操作,要么全部成功,要么全部失败,不存在中间的情况 。
consistency一致性:不管事务的结果是成功还是失败,最终的结果时一致的。
isolation隔离性:在并发访问资源的时候,不同的事务之间不会相互影响。事务之间是隔离的。
duability持久性。一个事务一旦执行成功,结果会被持久化,不会改变。
事务隔离性:
脏读:一个事务读取了另一个事务未提交的数据。解决方法(read commited)
不可重复读:一个事务内两次读取的结果不一样。(update)解决方法(repeatable-read)
幻读(虚读):一个事务内两次读取的表的记录数不一样。(insert)解决方法(serializable)更新丢失:一个事务修改的值,被另一个事务所覆盖。解决方法:乐观锁和悲观锁
脏读现象
事务1开启事务,并且查询id=3的age的初始值。
![](https://img.haomeiwen.com/i2250607/f0197afd4906202e.png)
事务2,隔离级别设置为:读未提交,查询id=3的age的初始值
![](https://img.haomeiwen.com/i2250607/e19696ce2906a234.png)
事务1修改id=3的age的值为2,但不提交
![](https://img.haomeiwen.com/i2250607/88fa19036c137697.png)
事务2,查询id=3的age的值,结果时读到了事务1修改后的值
![](https://img.haomeiwen.com/i2250607/a1c40e61728cf444.png)
事务1回滚
![](https://img.haomeiwen.com/i2250607/5357b72d0e02f7f2.png)
这时候事务2读到的是age=2就是无效的。这种现象就是脏读。
不可重复读:
事务隔离级别为读未提交和读已提交都会导致不可重复读。
先说读未提交,基于以上,可以看出事务2在同一个事务内,两次读取的值不一样,这就是不可重复读。
读已提交的情况:事务1
![](https://img.haomeiwen.com/i2250607/fcaac4fd0bbb78f4.png)
事务2 设置事务隔离级别为读已提交
![](https://img.haomeiwen.com/i2250607/feede677d2b57db5.png)
事务1修改id=3的age的值
![](https://img.haomeiwen.com/i2250607/95d782473aca8af2.png)
事务2查询id=3的age的值
![](https://img.haomeiwen.com/i2250607/8ab6ca8a216a1600.png)
事务1commit
![](https://img.haomeiwen.com/i2250607/034fb231dde3e211.png)
事务2查询id=3的age的值
![](https://img.haomeiwen.com/i2250607/c7bf47217efb953e.png)
这就是不可重复读,同一个事务里两次读取的不一样。
幻读(虚读)主要针对查询条数(insert)事务1
![](https://img.haomeiwen.com/i2250607/bd7e7035b97759d2.png)
事务2
![](https://img.haomeiwen.com/i2250607/bd7e7035b97759d2.png)
事务1开始事务,插入一条
![](https://img.haomeiwen.com/i2250607/9046d29952d333fb.png)
事务2查询
![](https://img.haomeiwen.com/i2250607/53564171a8ea0117.png)
这就是幻读,同一个事务中两次读取的条数不一样。
丢失更新:事务1
![](https://img.haomeiwen.com/i2250607/0f7d30fe69b6eed4.png)
事务2
![](https://img.haomeiwen.com/i2250607/0f7d30fe69b6eed4.png)
事务1更新id=1的name为bob
![](https://img.haomeiwen.com/i2250607/745ffecf83cd1ae4.png)
事务2更新id=1的age为12;
![](https://img.haomeiwen.com/i2250607/677fd7f18f210343.png)
事务1修改的数据被事务2覆盖,这就是丢失更新问题。
网友评论