spring事务管理主要有三个接口:
- 事务管理器接口:PlatformTransactionManager。可以为不同的框架提供不同的实现,包括Spring JDBC、iBatis、Hibernate(有版本限制,3.0以上,spring版本更高时需要更高版本)、JPA、Jdo、JTA
- 事务定义接口:TransactionDefinition。包括设置隔离级别(ISOLATION)、传播行为(PROPAGATION)、超时信息(TIMEOUT)、只读参数(READONLY)。
- 事务状态接口:TransactionStatus。获取事务具体的状态。
详细:
关于事务隔离级别,有5种。分别是:
- ISOLATION_DEFAULT,默认隔离级别,也就是根据数据的默认隔离级别,不同的数据库的隔离级别也不尽相同。
- ISOLATION_READ_UNCOMMITTED,级别最低的隔离级别。允许读取其他还未提交但已改变的数据,可导致脏读、幻读、不可重复读等异常
- ISOLATION_READ_COMMITTED,提交隔离级别。允许读取其他已经提交的数据,可防止脏读,但可能出现幻读、不可重复读
- ISOLATION_REPEATABLE_READ,更高级别的隔离。对相同字段的多次读取是一致的,可防止脏读、不可重复读,但可能出现幻读
- ISOLATION_SERIALIZABLE,级别最高的隔离。采用锁的方式进行事务操作,可以防止脏读、幻读、不可重复读,但随之而来的付出的时间和性能代价也更大
关于事务传播行为,事务传播行为主要是用来解决业务层对事务的调用问题,有7种。分别是:
- PROPAGATION_REQUIRED,默认的传播行为,当前如果有事务,Spring就会使用该事务,否则会开始一个新事务
- PROPAGATION_SUPPORTS,如果当前有事务则使用,没有也不会开始新事务
- PROPAGATION_MANDATORY,如果当前有事务则使用,没有则会抛出异常
- PROPAGATION_REQUIRES_NEW,总是会开启新事务,如果当前已经有事务存在会将原有的事务挂起
- PROPAGATION_NOT_SUPPORTED,以非事务形式运行行为,如果当前已经有事务存在则挂起该事务
- PROPAGATION_NEVER,以非事务形式运行行为,如果当前已经有事务存在则抛出异常
- PROPAGATION_NESTED,如果当前有事务存在,则嵌套在该事务下执行;没有则会开启新事务
事务超时时间则是以getTimeout()方法获取,单位为秒(s);是否只读则通过isReadOnly()方法获取。
关于TransactionStatus接口的操作主要有三个,分别是isNewTransaction() 是否是新事务、isRollbackOnly()是否是只回滚事务,还有一个最重要的方法setRollbackOnly(),这个方法将事务设置为只允许回滚操作,即事务在任何操作下都是最终执行回滚。