目录
Spring并不直接管理事务,而是提供事务管理的接口,由ORM框架提供具体实现
什么是事务
事务是一系列数据库操作,这些操作要么都完成,要么都不完成
事务的四个特性
事务的ACID特性:
- Atomic原子性:事务中的操作要么都完成要么都不完成
- Consistence一致性:事务执行前后要保持数据库的一致性
- Isolation隔离性:不同事务是独立的,不会互相影响
- Durability持久性:事务的提交对数据库造成的影响是持久的
事务的隔离级别
事务的并发可能带来的问题:
- 脏读:一个事务读到了另一个事务未提交的数据
- 丢失修改:一个事务的提交覆盖了另一个事务的提交
- 不可重复读:一个事务两次读取同一个数据,两次结果不一致(说明期间其他事务修改了数据)
- 幻读:一个事务读取几行数据,之后再读发现多了几行(说明期间其他事务添加了数据)
Spring框架规定的隔离级别
- TransactionDefinition.ISOLATION_DEFAULT:由数据库决定事务隔离级别
- 未提交读 TransactionDefinition.ISOLATION_READ_UNCOMMITTED
- 已提交读 TransactionDefinition.ISOLATION_READ_COMMITTED
- 可重复读 TransactionDefinition.ISOLATION_REPEATABLE_READ
- 序列化 TransactionDefinition.ISOLATION_SERIALIZABLE
事务的传播行为
事务的传播行为定义了一个事务中的方法调用了另一个事务中的方法时,该如何处理这种情况。
- TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则在当前事务中运行,否则新建一个事物运行
- TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则在当前事务中运行,否则在无事务状态下运行
- TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则在当前事务中运行,否则抛出异常
- TransactionDefinition.PROPAGATION_REQUIRES_NEW:总是新建一个事务在其中运行,把原来的事务挂起
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED:在无事务状态下运行,挂起原事务
- TransactionDefinition.PROPAGATION_NEVER:如果当前在事务里,则抛出异常,否则无事务状态下运行
- TransactionDefinition.PROPAGATION_NESTED:有事务则嵌套,否则相当于REQUIRED
Spring的编程式事务和声明式事务管理
编程式事务:使用Transaction Template,将事务管理内嵌在核心业务逻辑中,代码耦合度高
声明式事务:利用Spring AOP实现,有AspectJ和@Transactional注解两种方式