我们有一个带有INSTEAD OF INSERT触发器的表。为简单起见,触发器将值复制到另一个表,并添加时间戳以查看触发器是否仅运行一次(这是强制条件)。 我们想插入数千行(5-10)并只触发一次触发器。 我碰到的问题是,即使我设置了autocommit,并使用executeBatch,触发器也会运行多次。 以下是保存的Java代码:
@Transactional
public void saveMultiInserBatch(List<BulkImport> importThis) throws SQLException {
long start = System.currentTimeMillis();
StringBuilder build = new StringBuilder("insert into interface.ui_test (description) values(?)");
datasource.getConnection().setAutoCommit(false);
PreparedStatement ps = datasource.getConnection().prepareStatement(build.toString());
for (int i = 0; i < importThis.size(); i++) {
ps.setString(1, importThis.get(i).getDescription());
ps.addBatch();
}
ps.executeBatch();
datasource.getConnection().commit();
long end = System.currentTimeMillis();
System.out.println("Insert time was: " + (end - start));
}
插入后表中的值,触发器插入值:
Multi Insert Batch0 2018-06-13 04:02:05.0424486
Multi Insert Batch1 2018-06-13 04:02:05.1049570
Multi Insert Batch2 2018-06-13 04:02:05.3705852
Multi Insert Batch3 2018-06-13 04:02:05.3861983
Multi Insert Batch4 2018-06-13 04:02:05.3861983
Multi Insert Batch5 2018-06-13 04:02:05.3861983
Multi Insert Batch6 2018-06-13 04:02:05.3861983
Multi Insert Batch7 2018-06-13 04:02:05.3861983
Multi Insert Batch8 2018-06-13 04:02:05.3861983
Multi Insert Batch9 2018-06-13 04:02:05.3861983
...
从时间戳中可以看出,触发器多次运行。 什么可能导致这种情况?