batchSave 是自带事务的吗?还是需要外面套tx?

batchSave 是自带事务的吗?还是需要外面套tx?

评论区

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 学习了,大佬!~