事务的总结
1、事务简介
- 在mysql中只有使用InnoDB数据库引擎的的数据库才支持事务。
- 事务是用来管理可以改变数据库数据的语句,增删改的语句。
2、事务的四大特性
(1)原子性
一个事物的所有操作,要么全部完成,要么全部不完成。如果一个事物在执行过程中发生错误,钙食物会被回滚到事务开始状态。
(2)一致性
写入数据库的数据必须完全符合所有的预设规则。
(3)隔离性
数据库允许多个事务同时对其数据进行读写和修改的能力,他可以防止多个事务并发执行时有交叉执行而导致数据不一致。有四个级别,见下面。
(4)持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3、事务特性—隔离性
隔离强调的是两个或两个以上同时发生(并发)的业务同时操作一个数据库,为了让两个事务一方面能都看到、得到正确的结果,一方面还要保证一定的效率而产生的不同的隔离级别。
(1)读未提交
(2)读已提交
(3)可重复读
(4)串行化
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交** | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |
(1)读未提交
事务A和事务B,事务A未提交的数据,事务B可以读到,
这里读到的数据叫做”脏数据“,叫脏读
(2)读已提交
开启事务B开始读数据,当中事务A修改数据并提交,导致事务B在事务A提交前后所读到的数据不一致,这里针对update和delete语句,会导致不可重复读,避免了脏读。
大多数的数据库默认级别就是读已提交,eg:sql Server , Oracle
(3)可重复读
开启事务B读数据,事务A操作数据,导致事务B度的数据不一样,这里针对insert和delete语句,解决了不可重复读,但是出现了幻读,
他是mysql的默认级别,mysql通过多版本并发控制(MVCC)快照读解决了幻读的问题
(4)串行化
- 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发。
- 别的地方一用这个数据就不能修改删除,直到别的地方提交
4、事务实现原理
有点难度,理解不够