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