一、事务特性
- 原子性:事务是一个不可分割的整体。
- 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。(银行转账)
- 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。
- 持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
二、事务配置方式
- 编程式事务
- 声明式事务
三、事务传播机制
- PROPAGATION_REQUIRED:如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚,如果外层没有事务,新建一个事务执行。
- PROPAGATION_REQUES_NEW:每次都会新开启一个事务,同时把外层事务挂起,当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可。
- PROPAGATION_SUPPORT:如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行,完全依赖外层的事务。
- PROPAGATION_NOT_SUPPORT:不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码。
- PROPAGATION_NEVER:不支持外层事务,即如果外层有事务就抛出异常。
- PROPAGATION_MANDATORY:如果外层没有事务,则抛出异常。
- PROPAGATION_NESTED:可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。
四、事务隔离级别
- 脏读:脏读发生在一个事务读取了被另一个事务改写但尚未提交的数据时。如果这些改变在稍后被回滚了,那么第一个事务读取的数据就会是无效的。
- 不可重复读:不可重复读发生在一个事务执行相同的查询两次或两次以上,但每次查询结果都不相同时。这通常是由于另一个并发事务在两次查询之间更新了数据。(修改)
- 幻读:当一个事务(T1)读取几行记录后,另一个并发事务(T2)插入了一些记录时,幻读就发生了。在后来的查询中,第一个事务(T1)就会发现一些原来没有的额外记录。(新增或删除)
4.1 MySQL事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
网友评论