您的位置:首页 > 编程语言 > Java开发

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: