spring事务测试2,为了解决spring事务测试1

controller

    @RequestMapping(value = "/test.do")
    public void test(Integer[] ids,HttpServletResponse response,Integer type,Boolean isTrx){
        System.out.println("是否走事务方法:"+isTrx);
        if(!isTrx){//没有事物
            userInfoService2.testNotTrx(type);
        }else{//有事务
            userInfoService2.test(type);
        }

    }


service

public interface UserInfoService2 {

    //当前方法有事务
    public void test(Integer type);
    //当前方法有事务
    public void testNotTrx(Integer type);


}

public interface UserInfoService3 {



    //当前方法有事务
    public void test1();
    //当前方法有事务
    public void test2();
    //当前方法有事务
    public void test3();
    //当前方法有事务
    public void test4();
    //当前方法有事务
    public void test5();
    //当前方法有事务
    public void test6();
    //当前方法有事务
    public void test71();

}

serviceImpl

**
 * @ClassName UserInfoServiceImpl
 * @Description TODO(用户的基础信息)
 * @author Administrator
 * @Date 201783日 下午1:43:49
 * @version 1.0.0
 */
@Service

public class UserInfoServiceImpl2 implements UserInfoService2{
/**
     * @Field @serialVersionUID : TODO(这里用一句话描述这个类的作用)
     */
@Autowired
private UserInfoDao userInfoDao;
@Autowired
private UserInfoService3 userInfoService3;
@Transactional//有事务
@Override
public void  test(Integer type) {
    //数据库有条数据库:用户ID:204,用户名称userInfoService3.testName1


    UserInfo2 u1 = getUser1();
    userInfoDao.update2(u1);
    System.out.println("事务测试开始");
    System.out.println(userInfoDao.findUser2(u1).toString());
//  userInfoService3.test当前事务ID
    String trx_id=userInfoDao.selectTRX_ID();
    System.out.println("test 事务ID:"+trx_id);
    if(type==1){
        userInfoService3.test1();
    }
    if(type==2){
        userInfoService3.test2();
    }
    if(type==3){
        userInfoService3.test3();
    }
    if(type==4){
        userInfoService3.test4();
    }
    if(type==5){
        userInfoService3.test5();
    }
    if(type==6){
        userInfoService3.test6();
    }
    if(type==7){
        userInfoService3.test71();
    }
    System.out.println("事务测试结束");
}
@Override//没有事务
public void testNotTrx(Integer type) {
       System.out.println("事务测试开始");
        //数据库有条数据库:用户ID:204,用户名称userInfoService3.testName1
//          userInfoService3.test当前事务ID
              String trx_id=userInfoDao.selectTRX_ID();

              UserInfo2 u1 = getUser1();
              userInfoDao.update2(u1);
              System.out.println("test事务ID:"+trx_id);
              System.out.println(userInfoDao.findUser2(u1));
              if(type==1){
                  userInfoService3.test1();
              }
              if(type==2){
                  userInfoService3.test2();
              }
              if(type==3){
                  userInfoService3.test3();
              }
              if(type==4){
                  userInfoService3.test4();
              }
              if(type==5){
                  userInfoService3.test5();
              }
              if(type==6){
                  userInfoService3.test6();
              }
              if(type==7){
                  userInfoService3.test71();
              }
              System.out.println("事务测试结束");
}

private UserInfo2 getUser1(){
    //数据库有条数据库:用户ID:204,用户名称userName:getName1
     UserInfo2 u1=new UserInfo2();
     u1.setUserID(204); 
     u1.setUserName("getUser1");
     return u1;
  }

}



/**
 * @ClassName UserInfoServiceImpl
 * @Description TODO(用户的基础信息)
 * @author Administrator
 * @Date 2017年8月3日 下午1:43:49
 * @version 1.0.0
 */
@Service

public class UserInfoServiceImpl3 implements UserInfoService3{
/**
     * @Field @serialVersionUID : TODO(这里用一句话描述这个类的作用)
     */
@Autowired
private UserInfoDao userInfoDao;
//  事务传播行为
  @Transactional(propagation=Propagation.MANDATORY)
////如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
//  //适用于更新数据的操作
  public void test1(){

      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test1事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2).toString());
  }
  @Transactional(propagation=Propagation.REQUIRED)
  //如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
  //适用于更新数据的操作
  public void test2(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test2事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }
  @Transactional(propagation=Propagation.SUPPORTS)
  //如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  //适用于不需要事务的环境
  public void test3(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test3事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }
  @Transactional(propagation=Propagation.NOT_SUPPORTED)
  //以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  //试用于:当前方法是独立的事务,注意:当前方法执行完,外部方法的事务是否还存在?
  public void test4(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test4事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }
  @Transactional(propagation=Propagation.NEVER)
  //以非事务方式运行,如果当前存在事务,则抛出异常。
  public void test5(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test5事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }
  @Transactional(propagation=Propagation.NESTED)
  //如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
  //如果当前没有事务,则该取值等价于Propagation.REQUIRED
  public void test6(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test6事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }
  @Transactional(propagation=Propagation.REQUIRES_NEW)
//  方法运行在事务中,则挂起原事务,创建一个独立的新事物。否则也是创建一个独立的事务
  public void test71(){


      UserInfo2 u2 = getUser2();
      userInfoDao.update2(u2);
      String trx_id=userInfoDao.selectTRX_ID();
      System.out.println("test71事务ID:"+trx_id);
      System.out.println(userInfoDao.findUser2(u2));
  }


  private UserInfo2 getUser2(){
    //数据库有条数据库:用户ID:204,用户名称testName1
         UserInfo2 u2=new UserInfo2();
         u2.setUserID(204); 
         u2.setUserName("getUser2");
         return u2;
  }
}

测试 结果

测试:

// 事务传播行为
@Transactional(propagation=Propagation.MANDATORY)
////如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
// //适用于更新数据的操作
public void test1(){

是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344068
test1事务ID:1344068
UserInfo2 [userID=null, userName=getUser2]
事务测试结束



是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
2018-04-24 11:52:53,979 cn.xxx.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xxx.aop.ExceptionLogAspect
ERROR:  at No existing transaction found for transaction marked with propagation 'mandatory'

@Transactional(propagation=Propagation.REQUIRED)
//如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
//适用于更新数据的操作
public void test2(){



是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344072
test2事务ID:1344072
UserInfo2 [userID=null, userName=getUser2]
事务测试结束



是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test2事务ID:1344076
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

@Transactional(propagation=Propagation.SUPPORTS)
//如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
//适用于不需要事务的环境
public void test3(){

是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344082
test3事务ID:1344082
UserInfo2 [userID=null, userName=getUser2]
事务测试结束


是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test3事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

@Transactional(propagation=Propagation.NOT_SUPPORTED)
//以非事务方式运行,如果当前存在事务,则把当前事务挂起。
//试用于:当前方法是独立的事务,注意:当前方法执行完,外部方法的事务是否还存在?
public void test4(){

是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344084
2018-04-24 11:57:42,951 cn.xxx.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xxx.aop.ExceptionLogAspect
ERROR:  at 
### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
### The error may involve cn.xxx.core.dao.basicUser.UserInfoDao.update2-Inline
### The error occurred while setting parameters
### SQL: update UserInfo    SET UserName=?    where UserID=?
### Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
注意:挂起事务失败

是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test4事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

@Transactional(propagation=Propagation.NEVER)
//以非事务方式运行,如果当前存在事务,则抛出异常。
public void test5(){

是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344095
2018-04-24 12:00:58,694 cn.xiniu.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xiniu.aop.ExceptionLogAspect
ERROR:  at Existing transaction found for transaction marked with propagation 'never'




是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test5事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

@Transactional(propagation=Propagation.NESTED)
//如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
//如果当前没有事务,则该取值等价于Propagation.REQUIRED
public void test6(){

是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344097
test6事务ID:1344097
UserInfo2 [userID=null, userName=getUser2]
事务测试结束


是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test6事务ID:1344101
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

@Transactional(propagation=Propagation.REQUIRES_NEW)
// 方法运行在事务中,则挂起原事务,创建一个独立的新事物。否则也是创建一个独立的事务
public void test71(){


是否走事务方法:true
事务测试开始
UserInfo2 [userID=null, userName=getUser1]
test 事务ID:1344095
2018-04-24 12:00:58,694 cn.xiniu.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xiniu.aop.ExceptionLogAspect
ERROR:  at Existing transaction found for transaction marked with propagation 'never'
注意:挂起事务失败

是否走事务方法:false
事务测试开始
test事务ID:null
UserInfo2 [userID=null, userName=getUser1]
test71事务ID:null
UserInfo2 [userID=null, userName=getUser2]
事务测试结束

猜你喜欢

转载自blog.csdn.net/zhou920786312/article/details/80062804