Spring学习4-事务的回滚

一、手动的进行设置回滚代码
 
1.在配置文件中添加事务管理器
    
  <!-- 为数据源添加事务管理器 -->
      < bean id= "txManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager" >
           < property name= " dataSource" ref= "dataSrouce" ></ property >
      </ bean >
 
 
2.在dao中进行回滚事务
 
//   进行回滚的测试
      @Autowired
     DataSourceTransactionManager txManager;
     
      public void rollBack() {
          
          DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
          
//        开启事务
          TransactionStatus transaction = txManager.getTransaction( definition);
          
           try {
//            String sqlString="delete from student where sid = ?";
//            Object params []= {1};
//            如果没有数据,并不会发生异常
//            jdbcTemplate.update(sqlString, params );
              
//            但是插入相同的数据就会发生回滚
              insertData();
               //提交事务
               txManager.commit( transaction);
          } catch (Exception e) {
//            先进行事务的回滚
               txManager.rollback( transaction);
              System. out.println( "进行回滚");
          }
          
     }
 
二、使用事务模板,进行回滚代码,有利于解耦
1、在beans中还要进行配置,事务模板
 
< bean id= "transactionTemplate"
           class= "org.springframework.transaction.support.TransactionTemplate" >
           < property name= " transactionManager" ref= "txManager" ></ property >
 
  </ bean >
2、重要的是使用transactionTemplate类的excute方法,自动实现回滚。
 
    @Autowired
    TransactionTemplate transactionManager;
 
    public Object rollBack2() {
 
//        使用execute中的回调doInTransaction中进行代码操作,如果发生异常,那么就执行回滚
        Object execute = transactionManager.execute(new TransactionCallback<Object>() {
 
            @Override
            public Object doInTransaction(TransactionStatus arg0) {
 
                String messageString = "成功了";
                try {
                    insertData();
                } catch (Exception e) {
                    messageString = "进行回滚";
                }
 
                return messageString;
            }
        });
 
        return execute;
 
    }
 
三、使用注解
1、在beans中进行配置
   
   <!-- 为事务管理器注册注解驱动器 -->
      < tx:annotation-driven transaction-manager= "txManager" />
 
2.代码中使用
 
/**
    * 事务属性:
    *
    * propagation: 事务的传播行为. 即当前的事务方法被另外一个事务方法调用时,当前的事务方法如何使用事务.
    *     REQUIRED: propagation的默认值.  使用调用者的事务.
    *     REQUIRES_NEW: 不使用调用者的事务,自己重新开启新的事务来使用.
    * isolation:  事务的隔离级别. 最常用的取值:READ_COMMITTED
    * rollbackFor  : Class
    * noRollbackFor: Class
    * rollbackForClassName: String
    * noRollbackForClassName: String
    *
    * readOnly: 只读.  true / false
    *          指定事务是否为只读事务. 
    *         如果真的是只读的操作,则由必要将事务设置为只读事务,可以帮助数据库引擎进行优化.
    * timeout: 超时设置. 指定强制回滚事务之前 事务可以占用的时间. 避免一个事务占用过长的时间.
    */
 
    
  @Transactional(propagation = Propagation. REQUIRES_NEW, isolation = Isolation. READ_COMMITTED,
               // noRollbackFor= {UserAccountException.class}
              readOnly = true, timeout = 3)
      public void rollBack3() {
           try {
              insertData();
          } catch (Exception e) {
               throw new RuntimeException();
          }
     }
 
 
 
     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值