点击查看更多Spring文章
目录
1.TransactionDefinition.ISOLATION_DEFAULT
2.TransactionDefinition.ISOLATION_READ_UNCOMMITTED
3.TransactionDefinition.ISOLATION_READ_COMMITTED
4.TransactionDefinition.ISOLATION_REPEATABLE_READ
5.TransactionDefinition.ISOLATION_SERIALIZABLE
1.TransactionDefinition.PROPAGATION_REQUIRED
2.TransactionDefinition.PROPAGATION_SUPPORTS
3.TransactionDefinition.PROPAGATION_MANDATORY
4.TransactionDefinition.PROPAGATION_REQUIRES_NEW
5.TransactionDefinition.PROPAGATION_NOT_SUPPORTED
6.TransactionDefinition.PROPAGATION_NEVER
7.TransactionDefinition.PROPAGATION_NESTED
一.数据库中的事务机制
1.什么是事务
事务指的是一组操作,要么都执行,要么都不执行。最经典的例子就是转账的例子:A向B转账,如果A扣款了B就必须得到钱。但是如果在这个过程中发生了系统错误,A没有扣款,那么B也不会得到钱,这就是扣款和加钱这一组操作的事务性。
2.事务四大特性(ACID)
1.Atomic-原子性
事务是最小的单位,事务内的操作要不都成功,要不都失败。
2.Consistency-一致性
事务执行前后的数据被其他事物读取到时都是一致的。
3.Isolation-隔离性
多个事务之间同时执行也不会相互干扰,各事务相对独立。
4.Durability-持久性
事务执行之后,它对数据的改变是持久的,不会发生回退。
3.并发事务带来的四大问题
1.脏读
A事务读取了B事务的未提交的脏数据,导致A事务之后的操作都是错误的。
2.不可重复读
A事务读取数据后,B事务执行更新操作,导致A事务无法读取到原先的结果。
3.幻读
A事务读取数据后,B事务新添加了数据,导致A事务无法读取到原先的结果。
4.更新丢失
指的是A事务回滚而导致B事务的更新被撤销。
Q:不可重复读和幻读有什么不同?
不可重复读指的是A事务读取某条数据期间,B事务改变了该条数据,导致A的前后读取结果不一致,要解决这个问题只需要加行级锁,使A事务开启期间读取某条数据,其他事务不可对该条数据进行更改即可。
而幻读指的是A事务读取多条数据期间,B事务新增了数据,导致A的前后读取结果不一致,要解决这个问题需要加表级锁,使A事物读取多条数据期间,其他事务都无法更改该表的数据。
二.Spring中的事务机制
1.Spring中的事务作用于哪个层
Spring中的事务作用与业务层,在业务处理时如果有调用数据库操作,但是当业务处理过程中发生异常,则会将这个过程中涉及到的写数据库操作回滚。
2.Spring中事务管理的三种方式
- 编码式事务管理,通过Spring提供tx包下的事务类来进行事务的管理,但这属于硬编码的方式,不推荐使用。
- 基于XML的配置式事务管理,适用于需要管理的类较多的场合。
- 基于注解的配置式事务管理,适用于需要管理的类较少的场合。
3.Spring事务的隔离级别
Spring提供了事务的隔离级别,一般情况下选用的是默认隔离级别,即以数据库的隔离级别为准。(InnoDB的默认事务隔离级别为可重复读)。
1.TransactionDefinition.ISOLATION_DEFAULT
使用数据库默认的隔离级别。
2.TransactionDefinition.ISOLATION_READ_UNCOMMITTED
读未提交读,会导致脏读、不可重复读和幻读的产生。
3.TransactionDefinition.ISOLATION_READ_COMMITTED
读已提交读,防止了脏读的产生,但仍会产生不可重复读和脏读问题。
4.TransactionDefinition.ISOLATION_REPEATABLE_READ
可重复读,可以防止脏读、不可重复读的产生,但还是会产生幻读的问题。这里一般数据库使用了行锁。
5.TransactionDefinition.ISOLATION_SERIALIZABLE
可序列化,防止了全部并发问题的产生,采用表锁,性能低下。
4.Spring事务事务传播行为
Spring事务传播行为指的是在代码发生异常时,Spring事务提供的策略,有以下几种:
1.TransactionDefinition.PROPAGATION_REQUIRED
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2.TransactionDefinition.PROPAGATION_SUPPORTS
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
3.TransactionDefinition.PROPAGATION_MANDATORY
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
4.TransactionDefinition.PROPAGATION_REQUIRES_NEW
创建一个新的事务,如果当前存在事务,则把当前事务挂起。
5.TransactionDefinition.PROPAGATION_NOT_SUPPORTED
以非事务方式运行,如果当前存在事务,则把当前事务挂起。
6.TransactionDefinition.PROPAGATION_NEVER
以非事务方式运行,如果当前存在事务,则抛出异常。
7.TransactionDefinition.PROPAGATION_NESTED
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。