Jfinal Db.batch()提交问题

god_share 发布于 2014/07/16 17:54
阅读 6K+
收藏 1

@JFinal 你好,想跟你请教个问题:

Db.batch() 批量提交时,如何保证事物原子性。如:先进行Db.batch(), Db.update(),如果Db.update();出现异常。怎么解决?

加载中
1
JFinal
JFinal

     Db.batch 因为存在一个 batchSize 的问题,当达到 batchSize 时事务会提交,然后再处理剩下的数据,所以只要你的数据量在 batchSize 之内,这些数据的处理是在一个事务之内的。但这个 batchSize 也受数据库的限制,mysql 默认配置下大概是 5 万到 6 万

    另外,Db.batch 中的事务与其它 jfinal api 中的事务是独立的,所以不能将他们的事务统一成一个事务。

JFinal
JFinal
补充回复,最新版本的 jfinal 已经将 batch 方法纳入到事务之中,之前的回复已过时
0
god_share
god_share

那我说的那种情况,出现了异常,怎么能不让数据插入的数据库,我试了一下,目前而言,如果第一个Db.batch(),没有出现异常,正确执行了,第二个方法Db.update()出现异常了,此时,第一次的数据已经保存到数据了,所以怎么才能在出现异常后,两次数据都不保存。

现在业务这样的,当数据Db.batch()下没有出错,或者返回的长度大于0时,证明批量操作成功,此时更新另一个业务数据。而此业务数据异常了。那么正常情况下,就是这两个操作,都不应该成功,数据应该回滚,现在出现了脏数据,第一个成功了。不知道有什么办法可以解决。

JFinal
JFinal
多次 Db.batch(..) 方法调用在多个事务中,目前不支持此情况下统一为一个事务,通过查看 Db.batch 方法可知事务在方法中必定会提交,当 sql 总量小于等于 batchSize 时只提交一次事务,否则大于一次
0
god_share
god_share
http://www.oschina.net/question/578399_115917?sort=time,这个是你曾经回复过的一个帖子,但是,下面的我没看明白,按照那个说的,继承了Db.在,在后面加入try{} catch(),里面也加入了回滚。可以不起作用,可能我写错了,能给个明确的代码,或者处理方法吗?
0
longrmlife
longrmlife
我也发现这个问题了...
god_share
god_share
回复 @JFinal : 恩,好的我试试,谢谢你啦
JFinal
JFinal
回复 @god_share : 将所有要执行的sql全放在一个 Db.batch 下调用,并且让sql数量小于或等于 batchSize 就没有事务问题
god_share
god_share
兄弟,拜托了,我没有思路了
god_share
god_share
问题时怎么改,给点提示或者建议,或者一个建议的demo
0
longrmlife
longrmlife
自己改写源码解决~
返回顶部
顶部