昨天跟波总了解了下事务的处理,今天写个Test备忘一下。
在控制层中使用事务,简单的代码展示
@Before({POST.class , Tx.class}) public void saveWxSetting(){ log.info("saveWxSetting"); SysConfig sys1 = new SysConfig(); sys1.setId(PKUtil.getPK()); sys1.setKey("1"); sys1.setVal("1"); sys1.save(); SysConfig sys2 = new SysConfig(); sys2.setId(PKUtil.getPK()); sys2.setKey("1"); sys2.setVal("1"); sys2.save(); renderText(""); } |
其中key为唯一所以,事务生效。
后来探讨了下static方法是用与测试,代码有些变化:
在业务层增加:
public static boolean test(SysConfig sys){ return sys.save(); } |
控制层:
@Before({POST.class , Tx.class}) public void saveWxSetting(){ log.info("saveWxSetting"); SysConfig sys1 = new SysConfig(); sys1.setId(PKUtil.getPK()); sys1.setKey("1"); sys1.setVal("1"); SysConfig.test(sys1); SysConfig sys2 = new SysConfig(); sys2.setId(PKUtil.getPK()); sys2.setKey("1"); sys2.setVal("1"); SysConfig.test(sys2); renderText(""); } |
测试依旧OK:)
后台回到业务层,意味着取消控制层的事务
@Before(POST.class) public void saveWxSetting(){ log.info("saveWxSetting"); SysConfig sys1 = new SysConfig(); sys1.setId(PKUtil.getPK()); sys1.setKey("1"); sys1.setVal("1"); SysConfig sys2 = new SysConfig(); sys2.setId(PKUtil.getPK()); sys2.setKey("1"); sys2.setVal("1"); SysConfig.test(sys1,sys2); renderText(""); } /// @Before(Tx.class) public static boolean test(SysConfig sys1,SysConfig sys2){ return sys1.save()&&sys2.save(); } |
显然是失败了:( 因为:你这是业务层 aop 实现的事务,注意要用一下 Duang.duang(...) 去触发
如果在业务层中调用,代码变为:
@Before({POST.class}) public void saveWxSetting(){ log.info("saveWxSetting"); SysConfig sys1 = new SysConfig(); sys1.setId(PKUtil.getPK()); sys1.setKey("1"); sys1.setVal("1"); SysConfig sys2 = new SysConfig(); sys2.setId(PKUtil.getPK()); sys2.setKey("1"); sys2.setVal("1"); SysConfig sys = Duang.duang(SysConfig.class); sys.test(sys1, sys2); renderText(""); } @Before(Tx.class) public boolean test(SysConfig sys1,SysConfig sys2){ return sys1.save()&&sys2.save(); } 测试下来 Dung 和 Enhancer 效果一样:) |