作为企业级应用程序框架,Spring在不同的事务管理API上定义了一个抽象层。
程序员不必太了解底层的事务管理API,就能使用Spring事务管理机制。
如同EJB中的BMT(Bean-managed transaction,Bean管理事务)和CMT(Container-managed transaction,容器管理事务)方法一样,Spring即支持编程式的事务管理也支持声明式的事务管理。Spring事务支持的目标是给POJO添加事务功能,提供一种EJB事务的可选方法。
编程式事务管理:是将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。如果方法正常完成,通常会提交事务;如果方法抛出某种类型的异常,则回滚事务。
然而在使用编程式事务管理时,必须在每个事务操作中包含另外的事务管理代码。因此要在每个操作中重复样板事务代码。此外还很难对不同的应用程序启用和禁用事务管理。事务管理是横切关注点。
声明式事务管理:在大多数情况下要比编程式事务管理更好用。它将事务管理代码从业务中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring同Spring AOP框架支持声明式事务管理。这样可以帮助你更加轻松的为应用程序启用事务,并定义一致的事务策略。然而,声明式事务管理不太灵活,因为无法通过代码精确的控制事务。
事务属性:
原子性
一致性
隔离性
持久性
1.选择事务管理器实现
问题:一般情况下,如果应用程序只涉及单个数据源,可以只在数据库连接上调用commit()和rollback()方法来管理事务。
然而,如果事务扩展到多个数据源,或者你更喜欢使用JavaEE应用服务器提供的事务管理功能,就可以选择JTA(Java Transaction API,Java事务API)。此外,你可能还需要为不同的对象/关系映射框架(如:Hibernate或JPA)调用不同专用事务API。
因此,必须为不同的技术处理不同的事务API。很难从一组API切换到另一组API。
实现方案:PlateformTransactionManager是所有Spring事务管理器的通用接口。Spring内置了几个实现,用于不同事物管理API。
如果在应用程序中只需要处理一个数据源,并且通过JDBC进行存取,DataSourceTransactionManager应该满足需求。
如果在JavaEE应用服务器上涌JTA进行事务管理,就应该使用JtaTransactionManager从应该服务器查找事务。
如果使用ORM存取数据库,并且通过JDBC进行存取,就应该选取相应的事务管理器。
事务管理器以普通Bean的形式声明在SpringIoC容器里。例如,下面的Bean配置声明了一个DataSourceTransactionManager实例。
它需要设置dataSource属性,以便可以对这个数据源上的连接进行事务管理。
2.用事务管理器API编程式地管理事务
3.用事务模板编程式地管理事务
4.用经典的Spring AOP声明式地管理事务
问题:事务管理是一种横切关注点,AOP是实现它的理想方法。然而,如果要在Spring1.x中声明式地管理事务,就必须使用经典Spring AOP方法。
解决方案:Spring为事务管理提供了一个环绕通知,称作TransactionInterceptor。这个通知像事务模板一样控制这事务管理流程,但它使用于整个方法体,而不是任意的代码块。默认情况下,在方法开始之前,这个通知就启动了一个新的事务。如果方法抛出未受检的异常,上午就被回滚。否则完成方法之后就提交事务。
在经典Spring AOP中,必须利用ProxyFactoryBean为Bean创建一个代理来应用TransactionInterceptor通知。由于事务管理在企业应用中非常普遍,因此Spring提供了一个TransactionProxyFactoryBean类,它专用于创建事务代理。
Dao类:
Spring IoC容器:
Main类:
5.用事务通知声明式的管理事务
Main类:
6.用@Transactional注解声明式地管理事务
Spring IoC容器:
7.设置传播事务属性
问题描述:当事务方法别另一个方法调用时,必须制定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能启动一个新事务,并在它自己的事务中运行。
解决方法:事务的传播行为可以由传播事务属性制定。Spring定义了7种传播行为,这些行为时在org.springframework.transaction.TransactionDefinition中定义的。并非所有事务管理器类型都支持这些传播行为。
8.
9.
10.
11.
12.
13.
14
15.
16.
评论