1. 程式人生 > >jdbctemplate batchupdate 的事務管理

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); // 持久化所有資料
    }