Spring的声明式事务处理
2017-02-06 21:50
375 查看
声明式事务处理的介绍
Spring的声明式事务处理需要借助AOP的实现,本质是对方法前后拦截,然后在目标方法开始之前创建一个或者新建事务,在执行目标方法后根据执行情况提交或者回滚事务。特点:管理事务在配置文件里配置,与业务逻辑的代码分离
实现声明式事务处理需要apalliance.jar和cglib.jar,需要PlatformTransactionManager的实现类,因为使用的是JDBC,所以实现类是DataSourceTransactionManager类,并且使用Spring提供的TransactionProxyFactoryBean类实现事务代理。
代码示例
(1)创建DAO类
在该类的create()方法使用JdbcTemplate往数据库增加一条记录public class DAO { private DataSource dataSource; private JdbcTemplate jdbcTemplate; //通过依赖注入 public void setDataSource(DataSource dataSource) { this.dataSource=dataSource; jdbcTemplate =new JdbcTemplate(dataSource); } //注意这里看不到事务处理的代码,一切都在配置文件中 public void create(String msg) { jdbcTemplate.update("INSERT INTO USER VALUES('123', 'bieber')"); } }
(2)配置
因为在DAO中DataSource采用注入的方式实现,而且要使用TransactionProxyFactoryBean进行事务代理,所以还需要用配置文件来实现<!-- 设定dataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value> </property> <property name= 4000 "url"> <value>jdbc:sqlserver://localhost:1433</value> </property> <property name="username"> <value>sa</value> </property> <property name="password"> <value>12345678</value> </property> </bean> <!-- 设定transactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <!-- 示例中的一个DAO --> <bean id="DAO" class="spring.transaction.DAO"> <property name="dataSource"> <ref bean="dataSource"/> </property> </bean> <!-- 声明式事务处理 --> <bean id="DAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <!-- 代理的目标 --> <property name="target"> <ref bean="DAO"/> </property> <!-- 如果当前没有事务,就新建一个事务 --> <property name="transactionAttributes"> <props> <prop key="create*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
PROPAGATION_REQUIRED表示DAO类中的create()进行事务管理,并指明如果当前没有事务,就创建一个事务
Spring自定义的一些指定事务的属性值:
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务PROPAGATION_SUPPORTS:如果当前没有事务,就以非事务方式创建(就如果执行多条SQL语句,彼此没有关系,可以不都成功)
PROPAGATION_MANDATORY:如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,就把当前事务挂起
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,就抛出异常
另一种配置方式
<!-- 声明式事务处理 --> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionAttributeSource"> <value>spring.transaction.DAO.create*=PROPAGATION_REQUIRED</value> </property> </bean> <bean id="DAOProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="interceptorNames"> <value>transactionInterceptor,DAO</value> </property> </bean>
相关文章推荐
- Spring+Hibernate延迟和声明式事务处理最终解决方案
- spring声明式事务处理-注解
- Spring学习心得(22)-- spring声明式事务处理(使用jdbc操作数据库)
- Spring 声明式事务处理....XML
- spring04 数据库操作 spring+jdbc/hibernate 及其声明式事务处理
- Spring学习心得(23)-- spring声明式事务处理(hibernate)
- spring3.2+hibernate4.1采用声明式的事务处理
- Spring源代码解析(六):Spring声明式事务处理
- spring声明式事务处理(hibernate)
- spring 声明式事务处理及测试用类,其他未列出。
- Spring 的声明式事务处理
- spring 声明式事务处理
- spring与Hibernate的整合(以及spring的声明式事务处理)
- Spring——声明式的事务处理
- Spring不同事务管理方式与声明式事务管理局部回滚处理方案
- Spring3声明式事务处理事务无法回滚rollback分析(annotation与xml配置混用)
- Spring自学教程-声明式事务处理(六)
- Spring+Hibernate延迟和声明式事务处理最终解决方案
- 关于spring声明式事务管理异常处理的测试和小结
- 关于spring声明式事务管理异常处理的测试和小结