jdbctemplate batchupdate 的事務管理
良好的心態是不斷前進的 - 獻給不再年輕的自己
資料庫:sqlserver 2014
事務管理方式:程式設計式事務管理
資料庫訪問:spring jdbctemplate
目的:測試batchupdate 的事務控制
1. 不加顯式的事務管理
測試結果:batchupdate 中的每一條記錄都會自動的commit,如果有異常,則只有異常的資料執行失敗,其他資料不會rollback,並且後續的資料可以繼續執行
2. 加顯式的事務管理
batchupdate 會納入到事務管理中,即即使executeBatch 執行多次,只要有一次exception,則所有的資料都rollback
commit 時會一次把所有的資料 提交。
測試程式碼:
public void test() throws Exception {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(jdbcTemplate.getDataSource());
TransactionStatus status = transactionManager.getTransaction(def);
String sql = "insert into TEST(C1,C2,C3) values(?,?,? )" ;
try{
jdbcTemplate.execute(sql, new PreparedStatementCallback() {
public Object doInPreparedStatement(PreparedStatement ps) throws SQLException {
for (int i = 0; i < 100; i++) {
ps.setString(1, "bbbb" + i);
ps.setString(2, "iiii" + i);
ps.setInt(3, 2);
ps.addBatch();
if(i % 10 == 0){
ps.executeBatch();
}
}
ps.executeBatch(); // 資料不會持久化到資料庫中
return null ;
}
});
}catch (Exception e){
transactionManager.rollback(status); // 所有的資料都會rollback
throw e;
}
transactionManager.commit(status); // 持久化所有資料
}