容器事务
Spring事务核心接口
- JDBC事务管理器(DataSourceTransactionManager):本事务管理器是通过调用java.sql.Connection来管理事务.
- Hibernate事务管理器(HibernateTransactionManager):本管理器将事务管理的职责委托给org.hibernate.Transaction对象来管理事务,而后者是从HibernateSession中获取到的
- JPA事务管理器(JpaTransactionManager):通过一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)将与由工厂所产生的JPA EntityManager合作来构建事务
- JTA事务管理器(JtaTransactionManager):本管理器将事务管理的责任委托给javax.transaction.UserTransaction和javax.transaction.TransactionManager对象进行事务处理
数据读取类型说明
- 脏读
事务没提交,提前读取
- 不可重复读
两次读取的数据不一致
- 幻读
事务不是独立执行时发生的一种非预期现象
Spring事务属性定义
Spring事务属性是通过
org.springframework.transaction.TransactionDefinition
实现类来完成对事务属性的设置,
属性如下
- 传播行为
- 隔离规则
- 回滚规则
- 事务超时
- 是否只读?
事务传播行为
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播,
Spring的7种传播行为如下
事务隔离级别
隔离级别定义了一个事务可能受其他并发事务影响的程度
隔离级别分为
事务中注意的问题
- 事务是否只读
- 利用数据库事务的“只读”属性,进行特定优化处理
- 注意
- 事务的是否“只读”属性,不同的数据厂商支持不同
- 通常而言:只读属性的应用要参考厂商的具体支持说明,比如
Oracle的 “readOnly” 不起作用,不影响其增删改查
MySql的 “readOnly“ 为true,只能查,增删改则出异常
- 事务超时
事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束
- 设计事务时注意点:
为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源
- 事务回滚
默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚
- 自定义回滚策略
声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚
声明事务遇到特定的异常不回滚,即使这些异常时运行期异常