博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring事务测试2,为了解决spring事务测试1
阅读量:6690 次
发布时间:2019-06-25

本文共 9942 字,大约阅读时间需要 33 分钟。

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 2017年8月3日 下午1:43:49 * @version 1.0.0 */@Servicepublic class UserInfoServiceImpl2 implements UserInfoService2{
/** * @Field @serialVersionUID : TODO(这里用一句话描述这个类的作用) */@Autowiredprivate UserInfoDao userInfoDao;@Autowiredprivate UserInfoService3 userInfoService3;@Transactional//有事务@Overridepublic 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 */@Servicepublic class UserInfoServiceImpl3 implements UserInfoService3{
/** * @Field @serialVersionUID : TODO(这里用一句话描述这个类的作用) */@Autowiredprivate 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:1344068test1事务ID:1344068UserInfo2 [userID=null, userName=getUser2]事务测试结束是否走事务方法:false事务测试开始test事务ID:nullUserInfo2 [userID=null, userName=getUser1]2018-04-24 11:52:53,979 cn.xxx.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xxx.aop.ExceptionLogAspectERROR:  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:1344072test2事务ID:1344072UserInfo2 [userID=null, userName=getUser2]事务测试结束是否走事务方法:false事务测试开始test事务ID:nullUserInfo2 [userID=null, userName=getUser1]test2事务ID:1344076UserInfo2 [userID=null, userName=getUser2]事务测试结束

@Transactional(propagation=Propagation.SUPPORTS)

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

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

@Transactional(propagation=Propagation.NOT_SUPPORTED)

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

是否走事务方法:true事务测试开始UserInfo2 [userID=null, userName=getUser1]test 事务ID:13440842018-04-24 11:57:42,951 cn.xxx.aop.ExceptionLogAspect.afterThrowing(ExceptionLogAspect.java:20) cn.xxx.aop.ExceptionLogAspectERROR:  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:nullUserInfo2 [userID=null, userName=getUser1]test4事务ID:nullUserInfo2 [userID=null, userName=getUser2]事务测试结束

@Transactional(propagation=Propagation.NEVER)

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

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

@Transactional(propagation=Propagation.NESTED)

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

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

@Transactional(propagation=Propagation.REQUIRES_NEW)

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

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

转载于:https://www.cnblogs.com/feiZhou/p/9344017.html

你可能感兴趣的文章
人的差别在于业余时间
查看>>
网游通讯加密的方案设计
查看>>
2. 工厂模式
查看>>
感冒没状态
查看>>
破空(读悟空传)
查看>>
PHP读取ZIP文件详细信息
查看>>
进程是否接受结束
查看>>
面向对象与抽象编程的关系
查看>>
myeclipse8.x注册码
查看>>
聊聊Druid(二) -- 获取连接
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
查看>>
ubuntu 安装MYSQLDB , pymssql记录
查看>>
安全细节考虑
查看>>
SpringBoot 免费学习极速入门到整合
查看>>
gridview取值不为&nbsp
查看>>
【python学习】网络爬虫——爬百度贴吧帖子内容
查看>>
所有岗位通过集中无领导小组讨论一起面试来筛选科学吗?
查看>>
Ubuntu下mysql字符集设置
查看>>
Linux下搭建MySQL数据库系统
查看>>
Mysql分页查询丢失数据
查看>>