Spring提供编程式的事务管理(Programmatic transaction manage- ment)与声明式的事务管理(Declarative transaction management)两种方式。
从JDBC的事务控制谈起:
try {
.....
connection.setAutoCommit(false);
.....
// 一连串SQL操作
connection.commit();
} catch(SQLException) {
// 发生错误,回滚所有数据库数据操作
connection.rollback();
}
在Spring中对JDBC的事务管理加以封装,Spring事务管理关键在于org.springframework.transaction.PlatformTransactionManager接口的实现:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
PlatformTransactionManager接口的事务实现类有:
- DataSourceTransactionManager
- HibernateTransactionManager
- JdoTransactionManager
- JtaTransactionManager
下面看看编程式事务是怎么在代码中编写的:
编程式的事务管理
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
public void testTransationCommit(){
PlatformTransactionManager transactionManager = SpringBeanFactory.getBean("baseTransactionManager",
PlatformTransactionManager
.class);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try{
//execute SQL
transactionManager.commit(status);
}catch(Exception e){
transactionManager.rollback(status);
}
}
声明事务管理
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务传播特性 -->
<tx:advice id="TestAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="find*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="REQUIRED"/>
<tx:method name="apply*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置参与事务的类 -->
<aop:config>
<aop:pointcut id="allTestServiceMethod" expression="execution(* com.test..*Service.*.*(..))"/>
<aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" />
</aop:config>
需要注意的地方:
(1) advice(建议)的命名:由于每个模块都会有自己的Advice,所以在命名上需要作出规范,初步的构想就是模块名+Advice(只是一种命名规范)。
(2) tx:attribute标签所配置的是作为事务的方法的命名类型。
如<tx:method name="save*" propagation="REQUIRED"/>
其中*为通配符,即代表以save为开头的所有方法,即表示符合此命名规则的方法作为一个事务。
propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
(3) aop:pointcut标签配置参与事务的类,由于是在Service中进行数据库业务操作,配的应该是包含那些作为事务的方法的Service类。
首先应该特别注意的是id的命名,同样由于每个模块都有自己事务切面,所以我觉得初步的命名规则因为 all+模块名+ServiceMethod。而且每个模块之间不同之处还在于以下一句:
expression="execution(* com.test.testAda.test.model.service.*.*(..))"
其中第一个*代表返回值,第二*代表service下子包,第三个*代表方法名,“(..)”代表方法参数。
(4) aop:advisor标签就是把上面我们所配置的事务管理两部分属性整合起来作为整个事务管理。
Spring中常用事务类型:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
详细的可以参考:http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html
分享到:
相关推荐
spring事务控制jar包,请网上自寻下载
Struts Spring mysql整合开发,Spring Aop事务控制,ssh用户登录实例
自己做的一个小案例,spring 的事务管理小案例,你也可以去以下链接看文章讲解https://blog.csdn.net/zyqblog/article/details/82624441
配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用
springMVC框架事务控制,保证业务操作的完整性 防止在一些意外(例如说突然断电)的情况下出现乱数据,防止数据库数据出现问题。 如:银行转帐。A账户减少的钱要加到B账户上,若A这边减了钱,B那边却还是一样的数,这...
声明式事务控制,spring2.5+hibernate3集成源码,附带有数据库脚本,可以直接导入到项目的工作空间。欢迎下载
Spring Boot数据库事务控制.zip
简单的Spring+MyBastis事务控制代码,包括2个超简单的数据库表,服务代码(同时更新2个表的数据,如果后面的表的处理出错,则事务会回滚),只是简单演示了事务控制功能,其他的没有涉及。测试功能采用JUnit4.
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
spring通过aspectj来实现事务控制
spring 简介,spring事务控制,Spring注解,spring定时调用,spring线程池,springMVC,quartz,springsecurity,的详细解析文档
Spring4+SpringMVC+Mybaties 内含有事务控制
1.问题引入 2.事务基本概念、特性 3.事务并发引起问题,隔离级别 4.Springboot事务控制
Spring中的事务控制,内有详细的说明。
Spring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务控制.docxSpring Boot的事务...
最简单的dbutils+spring事务控制,注解+xml配置,入门必备.绝对可以运行.包含spring bean,aop,注解,事务等基础知识
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
四,Spring基于注解的开发对应源代码,事务详解(概念重点),基于注解的事务控制,Spring集成JUnit
演示了spring编程式事务的实现,通过TransactionTemplate模板进行事务控制