事务是什么
事务是一系列操作,是程序的执行单元。
我们需要通过一系列手段尽量使事务满足ACID原则。
四个特性
原子性:事务中的所有操作是一个整体,要么全都执行,要么全都回滚。
一致性:事务的开始和完成都保持一致。
隔离性:事物之间是相互独立的,中间状态对外不可见
持久性:事务的修改是永久的
一致性
内部一致性:解决丢失修改,脏读、不可重复读
外部一致性
- 强一致性:系统中某个数据成功更新后,后序操作都将得到更新后的值。
- 弱一致性:不能保证强一致性
- 最终一致性:在一段时间后,数据会达到一致性状态。期间可能会有不同进程读取数据不一致的情况。
并发问题
- 脏读:A事务还未提交,B事务就读到了结果。
- 不可重复读:A事务操作过程中出现前后读取数据不一致或不存在的情况。(破坏一致性,update delete)
- 幻读:A事务操作过程中出现,第一次读取不存在,第二次读取出现了(破坏一致性,insert)
隔离级别
- 读未提交:只能保持持久性。行级共享锁。
- 读已提交:语句级别。解决脏读
- 可重复读:事务级别。解决不可重复读。
- 串行化:串行化执行,非并发,性能低。
Innodb实现隔离级别
通过读取事务时加锁和释放机制。
读未提交:读取数据加行级共享锁,读完释放。
读已提交:写数据加行级排它锁直到事务结束。
可重复读:写数据加行级排它锁直到数据结束,读数据加行级共享锁直到事务结束。
串行化:读数据时加表级共享锁知道事务结束。
网友评论