首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
batchSave 是自带事务的吗?还是需要外面套tx?
太岳三清峰
2019-05-13 12:10
batchSave 是自带事务的吗?还是需要外面套tx?
项目:
JFinal
2
评论区
JFinal
2019-05-13 12:11
batchSave 的事务开启方式与其它情况完全一样,仍然是 @Before(Tx.class) 或者 Db.tx
回复
太岳三清峰
2019-05-13 13:09
@JFinal
这样对吗?如果不用Db.tx ,是不是 batchSave 的第3个参数 就不起作用?因为不自带事务嘛
Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
Db.batchSave("te_timeindex",indlist,100);
return true;
}
});
回复
JFinal
2019-05-13 13:21
@太岳三清峰
没错
这里要注意一个问题,你的 batchSize 指定的是 100,那么每次在 100 条数据执行完成后就会提交一次事务,如果你的数据多余 100 条,那么会提交多次事务,事务提交后是不能回滚的,所以多次提交事务,如果后面出现异常,那么已提交的事务是不能回滚的
如果希望所有操作全在一个事务中,可以将 batchSize 弄成与数据量一样的值,例如:
Db.batchSave("te_timeindex",indlist, indlist.size());
上面使用了 indlist.size() 作为 batchSize,那么 JDBC 在多数情况下只会提交一次数据
使用 indlist.size() 作为 batchSize 时,如果数据量特别大,例如超过 2 万行数据,那么 JDBC 仍然可能分批提交事务,这个可能与 mysql 配置的缓冲区大小有关, 一般几千条数据在一个 batch 中没事
回复
fmpoffice
2021-08-24 10:22
@JFinal
学习了,大佬!~
回复
发送
我要反馈
热门反馈
扫码入社