本文大部分是对Spring reference的翻译,属于读书笔记/摘要:
为什么要有Spring 事务管理,它的好处:
为所有不同的事务API提供一致的访问方式。
支持声明式事务管理。
简化编程式事务管理。
与Spring的数据访问抽象集成。
Spring事务抽象的关键式是事务策略。一个事务策略是由这个接口定义的:
org.springframework.transaction.PlatformTransactionManager
public interfacePlatformTransactionManager { TransactionStatusgetTransaction( TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
TransactionException会被PlatformTransactionManager的每个方法抛出,它是一个unchecked Exception. 继承了java.lang.RuntimeException。
getTransaction(..)方法返回一个TransactionStatus对象。TransactionStatus对象可能代表了一个新的transaction,也可能是一个已有的transaction。TransactionStatus是跟一个线程的执行相关联的。
TransactionDefinition接口定义了以下内容:
Isolation:事务隔离度。一个事务对其他事务的隔离程度。比如它是不是允许对其他事务没有commit的数据。
Propagation:事务传播机制。一般情况下一个事务中的代码都会在本事务中执行,但是如果在执行这个方法之前已经有事务存在,你可以选择就在这个现有的事务中执行,也可以选择让当前事务挂起而创建一个新的事务执行你的代码。
Timeout:事务的超时时间。如果一个事务执行超过了设定的超时时间就会自动回滚。
Read-only status:当你的代码只做读操作时。只读事务对一些情况时很好的优化,比如Hibernate。
public interface TransactionStatus extends SavepointManager { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); void flush(); boolean isCompleted(); }
使用Spring的事务管理,第一步就是定义一个PlatformTransactionManager的实现,一般时用依赖注入的方式。
JDBC的实现:DataSourceTransactionManager
JTA的实现:JtaTransactionManager
Hibernate的实现LocalSessionFactoryBean
Rollbackrules使得用户可以指定在发生哪些Exception或者throwables的时候rollback。在发生unchecked exception时是自动rollback的。
@Transactional只有加在public的方法上才有作用。
@Transactional可以被加在interface上,interface的方法上,类定义上,类的公共方法上。