Spring的事务管理涉及初衷:(What we need?)
1、 可编程的事务管理和一致的异常处理机制。
2、 在POJO上面实现的声明式事务、无需要绑定到重量级组件模型上 3、 可插拔的事务策略、以及让资源能够自由加入事务的手段 4、 为分布式容器而准备的JTA支持
5、 针对各种ORM框架集成而提供的数据源组件
下面正式介绍Spring的事务框架组成,主要核心为3个接口:TransactionDefinition、TransactionStatus、PlatformTransactionManager。它们分别的职能如下: TransactionDefinition
封装所有事务相关属性的设定。针对事务隔离性级别提供的属性有ISOLATION_DEFAULT、ISOLATION_READ_UNCOMMITTED、ISOLATION_READ_COMMITTED、ISOLATION_SERIALIZABLE。针对事务传播提供六个传播属性分别为PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORT、PROPAGATION_NESTED。用过EJB的会发觉这基本和EJB CMT保持一致。 TransactionStatus
它允许事务管理者控制事务的执行,只有3个接口方法:isNewTransaction()、setRollbackOnly()、isRollbackOnly()。其中setRollbackOnly将对当前事务进行回滚操作并将其终止。
PlatformTransactionManager
这是事务管理的策划者,它使用了前面两个接口来完成事务的创建和管理。它提供了getTransaction()、commit()、rollback()3个方法,针对一个给定的TransactionDefinition返回一个TransactionStatus对象,并且对这个状态对象触发提交或者回滚操作。如进行手工编程式的事务管理,基本就是操作这3个接口的实现类的编码在try/catch中间的代码块编写资源存取代码,事务运行结果就是Manager对象的提交或者回滚。
1.TransactionDefinition definition = new DefaultTransactionDefinition();
2.//set definition features here 3.//… 4.TransactionStatus status = transactionManager.getTransaction(definition); 5.try{
6. //do some resource access 7. //or business logical use these resource 8.}catch(BusinessException ex){
9. transactionManager.rollback(status); 10. throw ex; 11.}
12.transactionManager.commit(status);
13.//return some result 编程式的事务管理要编写比较繁琐的代码,不是常用的方式。我们主要来看更加轻便高效的声明式事务管理(Declarative Transactions)。在Spring容器中声明式意味着我们要告知Spring某个Bean的某个方法需要事务管理,之后Spring会保证此方法被调用时候有事务贯穿其中。这种实现方式需要依赖AOP对方法调用进行拦截。Spring提供两种声明式的方式来创建一个事务管理代理(AOP的核心是动态代理):ProxyFactoryBean和TransactionProxyFactoryBean。看两个例子: 1. business.BusinessObject.method1=PROPAGATION_REQUIRED,-BusinessCheckedException 14.business.BusinessObject.method2=PROPAGATION_REQUIRED,+BusinessCheckedException 15. 18.19. 20.
再看另外一种使用TransactionProxyFactoryBean的方式配置的声明式事务管理——
1.
大体上Spring的事务管理就是这样,注意到所有的事务属性都通过key-value的形式在配置文件中的transactionAttributes或者transactionAttributeSource中指定,但目前更流行的一种方式的通过源码级别的元数据来设置事务属性。这一点我在之前写过的Spring与OpenJPA的集成中已经举过例子。
发表于 @ 2008年09月16日 23:37:00 | 评论( 0 ) | 编辑| 举报| 收藏
因篇幅问题不能全部显示,请点此查看更多更全内容