springframework【13】

spring的事务管理

 

Spring提供了编程性事务管理与声明式的事务管理。Spring事务管理的抽象关键在于org.springframework.transaction.PlatformTransactionManager接口的实现。

PlatfromTransactionManager接口有许多具体的事务实现类,例如:DataSourceTransactionManager、HibernateTransactionManager、JdoTransactionManager,JtaTransactionManager等等。

  此处需要注意的是,要使用Mysql数据库进行事务处理,必须建立支持事务的表类型,例如:InnoDB的表类型。

1、  Spring提供的编程性事务

可以清楚的控制事务的边界,自行实现事务的开始时间,撤销时间,结束时间等,可以实现细粒度的事务控制。

编码例子如下:

 

private PlatformTransactionManager txManager;

    public void setTxManager(PlatformTransactionManager txManager) {

       this.txManager = txManager;

}

    public void insertUser(User user)  {

       DefaultTransactionDefinition def = new DefaultTransactionDefinition();

       def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

       TransactionStatus status = txManager.getTransaction(def);

       try{

           JdbcTemplate tmp = new JdbcTemplate(dataSource);

           tmp.execute("insert  into tbl_user (name,pwd) values ('"+user.getName()+"','"+user.getPwd()+"')");

            //写错的sql,等着抛出运行时异常

           tmp.update("sssssssssssss");

           UserUpdate uu = new UserUpdate(dataSource);

            uu.update(new Object[]{user.getName(),user.getPwd()});

       }catch(DataAccessException e){

           txManager.rollback(status);

           throw e;

       }

           txManager.commit(status);

    }

 

配置文件的写法如下:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"></property>

</bean>

<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl">

    <property name="dataSource" ref="dataSource"></property>

    <property name="txManager" ref="txManager"></property>

</bean>

 

2、  声明式的事务管理

Spring事务的相关API可以不用介入程序之中,只是在配置文件上修改配置下就可以移去事务管理服务。Spring的声明式事务是通过springAOP来实现的,所以执行程序的时候,请记得将spring-aop.jar给放到classpath中。

1)、最基础的事务配置如下:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"></property>

</bean>

<bean id="userDao" class="com.itcast.dao.impl.UserDaoImpl">

    <property name="dataSource" ref="dataSource"></property>

    <property name="txManager" ref="txManager"></property>

</bean>

<!-- 事务代理 -->

<bean id="userDaoTxProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="target" ref="userDao"></property>

    <property name="transactionManager" ref="txManager"></property>

    <property name="transactionAttributes">

    <props>

    <prop key="insert*">PROPAGATION_REQUIRED</prop>

</props>

 

我们在使用的时候只是需要取得userDaoTxProxy 而不是userDao就可以完成对这个Dao的事务控制了。

2)、将事务抽象提取,让我们的代理类取得一个拦截器方式的事务,从而将每个代理类的事务都抽象出来集中管理,这样只要我们命名规范,那么我们的事务处理就更加容易。

例如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值