Spring详解之管理事务(八)

PlatformTransactionManager帮助我们管理任意平台的事务

每个框架都有管理平台的事务

jdbc管理事务的是DataSourceTransactionManager

hibernate   ......HibernateTransactionManager

................................................TransactionManager

事务的四大特性(一致性,原子性,持久性,隔离性)

事务线程安全:脏读,不可重复读,幻读,读未提交

所有事务的操作分三步走:

开启事务---》提交事务---》回滚事务

spring管理事务,利用的是spring aop思想,将事务的操作织入到目标对象中

spring管理事务的属性

隔离级别:是否只读,事务的传播行为为(7种)

Spring详解之管理事务(八)


spring管理事务的方式

(1)代码式

配置事务管理对象

<!--配置事务管理对象-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

配置事务管理的模板

<!--配置事务管理对象的模板-->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>

在service中注入模板对象的execute方法

public class UserServiceImpl implements UserService {
    @Resource(name = "transactionTemplate")
    private TransactionTemplate tt;

  /*  public void setTt(TransactionTemplate tt) {
        this.tt = tt;
    }
*/
    
private UserDao userDao;
    @Override
    public void transform(Integer form, Integer to, Integer money) {
        tt.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                userDao.increase(to,money);
                //设置异常查看事务是否生效
               // int i=1/0;
                
userDao.decrease(form,money);
            }
        });

}

public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

(2)xml配

配置事务管理对象置

<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

配置事务管理对象的模板

<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

配置通知

<tx:advice id="myAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!--userService中的方法-->
        <!--isolation隔离级别为4  propagation传播方式 read-only只读为false-->
        
<tx:method name="transform" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"></tx:method>
        <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="update**" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method>
        <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method>
        <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method>
    </tx:attributes>
</tx:advice>

(

标签名tx:advice   id 给当前的事务起个标记,transactionManager配置刚刚的事务管理对象

配置参数:method  name  可以是具体某个方法(方法名)比较麻烦,可以使用通配符的方式去设置

add*  delete*  update*  get*

Persist*  remove*  modify*  find*

要求命名规范

Isolation隔离级别使用默认即可,默认为4级别Default

propagation事务的椽笔行为默认为required

Reay-only是否为只读true/false

)

将通知织入到目标对象

配置切面不再使用aop;aspect而是advisor

<aop:config>
    <!--<aop:pointcut id="txPc" expression="execution(cn.hd.springTransaction.Impl.UserServiceImpl.transform)"></aop:pointcut>-->
    
<aop:pointcut id="txPc" expression="execution(* cn.hd.springTransaction.Impl.*ServiceImpl.*(..))"></aop:pointcut>
    <aop:advisor advice-ref="myAdvice" pointcut-ref="txPc"></aop:advisor>
</aop:config>

userService书写


public class UserServiceImpl implements UserService {
   /* @Resource(name = "transactionTemplate")
    private TransactionTemplate tt;*/

  /*  public void setTt(TransactionTemplate tt) {
        this.tt = tt;
    }
*/
    
private UserDao userDao;
    @Override
    public void transform(Integer form, Integer to, Integer money) {
       /* tt.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

            }
        });*/

        
userDao.increase(to,money);
        //设置异常查看事务是否生效
        // int i=1/0;
        
userDao.decrease(form,money);
    }

    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}


注解配置

开启注解模式

<!--配置事务管理对象-->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务管理对象的模板-->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>

<!--开启注解模式-->
<tx:annotation-driven></tx:annotation-driven>

在想要设置事务的地方添加注解

可以有两个位置(1.类上面,该类中所有的方法都会使用以上参数的事务,2方法名上面,该方法使用参数中的事务)如果两个都设置则以方法名上面的事务为准


public class UserServiceImpl implements UserService {
   /* @Resource(name = "transactionTemplate")
    private TransactionTemplate tt;*/

  /*  public void setTt(TransactionTemplate tt) {
        this.tt = tt;
    }
*/

    
private UserDao userDao;
     @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,readOnly = false)
    @Override
    public void transform(Integer form, Integer to, Integer money) {
       /* tt.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

            }
        });*/

        
userDao.increase(to,money);
        //设置异常查看事务是否生效
        // int i=1/0;
        
userDao.decrease(form,money);
    }

    public UserDao getUserDao() {
        return userDao;
    }
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}