问题描述
小弟在做一个项目,遇到一个问题,大致是这样的:在一个action里面,要调用service层的两个方法,这两个方法是把当前两个对象提交到数据库的,并且该方法会抛出异常,现在要保证该方法全部执行成功,才把这两个对象提交到数据库的,任何一个方法抛出异常就返回错误页面!恳请各位大侠说出思路,不只同步可不可实现。
解决方案
解决方案二:
吃饭回来再看。先占个位。
解决方案三:
...用2个if不就行了吗?反正你判断哪一个如果不行的话都要报错,又不存在同步的问题if(ManagerA.method){if(ManagerB.mehtod){returnSUCCESS;}else{returnERROR;}}else{returnERROR;}不知道我这样理解你对不对?
解决方案四:
引用2楼banglezwy的回复:
...用2个if不就行了吗?反正你判断哪一个如果不行的话都要报错,又不存在同步的问题if(ManagerA.method){if(ManagerB.mehtod){ returnSUCCESS;}else{ returnERROR;}}else{returnERROR;}不知道我这样理解你对不对?
如果a方法执行成功了,那么这条数据就已经进入数据库了,即使b方法错误了也是如此
解决方案五:
应该用事务处理吧。。
解决方案六:
if(ManagerA.method){if(ManagerB.mehtod){returnSUCCESS;}else{methodReturnA();returnERROR;}}else{returnERROR;}你可以再action里面再写1个方法methodReturnA,如果A不成功,就报错了,如果A成功了,B不成功,B就不执行了,在返回错误之前调用action的methodReturnA方法,用来返回A中的数据。
解决方案七:
配置什么样的事务呢?急呀,银行项目的,
解决方案八:
事务不显示吧,是不同的Manager吧,要不你写成1个manager做一下事务的控制,就可以做事务回滚了
解决方案九:
这不就是事务处理吗!在service层进行事务管理,把2个方法合成1个。
解决方案十:
对,加上if判断就行了。
解决方案十一:
可以考虑用ejb控制一下事务我们现在都是通过ejb进程事务控制的。还有如果要是用到了spring框架可以用spring框架控制事务。我觉得ejb是个比较不错的东西。你要有一个大的service方法然后还要两个小的service方法。在action里调用这个大的service方法然后大service方法里分别调用那两个插入对象的方法!
解决方案十二:
你不能直接在action里分别调用这两个方法!
解决方案十三:
加if返回标识即可。。
解决方案十四:
引用10楼wzc_zxy的回复:
可以考虑用ejb控制一下事务我们现在都是通过ejb进程事务控制的。还有如果要是用到了spring框架可以用spring框架控制事务。我觉得ejb是个比较不错的东西。你要有一个大的service方法然后还要两个小的service方法。在action里调用这个大的service方法然后大service方法里分别调用那两个插入对象的方法!
得,EJB都整出来了。为了做个事务处理还得把项目重做一遍!
解决方案十五:
两个方法不执行插入,只返回一个标识位,然后通过这两个返回的标识判断,由另一个方法执行插入数据提交。
解决方案:
事务处理。如果你用了spring。。。如果你除了actionservice之外还有一层dao如果你的service是调用的dao层,并且你的事务配置是在service层,那么,把你的两个插入操作写在同一个service方法里面,外加trycatch,例如saveAandB(A,B)然后在action里面调用这个service中的saveAandB(A,B)方法。
解决方案:
这样,一旦某一个插入失败出错之后,整个方法就会回滚的。
解决方案:
不能直接调用两个方法。把2个方法合成1个吧。
解决方案:
引用13楼bayougeng的回复:
引用10楼wzc_zxy的回复:可以考虑用ejb控制一下事务我们现在都是通过ejb进程事务控制的。还有如果要是用到了spring框架可以用spring框架控制事务。我觉得ejb是个比较不错的东西。你要有一个大的service方法然后还要两个小的service方法。在action里调用这个大的service方法然后大service方法里分别调用那两个插入对象的方法!得,EJB都整出来了。为了做个事务处理还得把项目重做一遍!
呵呵我没考虑那么多。那就方法里嵌套方法。第一个方法插入判断是否成功成功然后再调用另一个方法。看来我真有点笨哈!!o(∩_∩)o哈哈
解决方案:
try{method1();method2();commit();}catch(Exceptione){rollback();}
解决方案:
用事务
解决方案:
我在沉思,这银行系统安全吗???
解决方案:
如果你这两个方法在同一个service中的话,可以用其中一个方法调用别一个方法,然后这个方法启用事务处理。如果不在同一个service的话,就在action中自己写个事务吧。
解决方案:
什么银行,以后咱们小心点。。。
解决方案:
我明天就把钱从银行把我那几百块取出来放我枕头底下,安全!!!思路:如果被调用的两个方法都是Code管理Transaction的,你就没办法实现你说的那个目的,只有自己重写个新的方法,把那两个方法的实现Copy进来,用一个Transaction来控制。如果那两个方法是用Container的declarativeTransaction,还得看他们的TransactionAttribute,如果是Required/Mandatory/Supports的,你就在你的Action的方法加上transaction--Required呃,我觉得说多了也没啥用.......
解决方案:
直接判断只要其中有一个不成功,就把将要保存的数据从表中删除。即使表中还没有数据被保存调用delete也不会报错。
解决方案:
感觉lz分层逻辑有问题,一个service中的方法就是执行一个操作。根据lz的描述,应该是一个方法中执行2个关于数据插入的操作。按照我的想法,应该是一个service中的方法调用2个dao中的方法。然后事务处理配置在这“一个”service方法上。在这个方法中,无论什么位置出现例外,事物都会回滚。也就是实现了lz所谓的“保证一次调用两个操作并且保证数据完整性”的需求了。这是我的个人理解,错了还请见谅。呵呵goodluck
解决方案:
引用19楼believefym的回复:
Javacodetry{method1();method2();commit();}catch(Exceptione){rollback();}
支持楼上的
解决方案:
如果2个方法是对数据库的操作的话用存储过程封装下在存储过程中写事务这样应该很OK得