簡介:spring
在實際的業務中,咱們每每須要將一些DB的寫操做綁定到一塊兒造成一個「事務」,作到要麼所有成功,要麼所有失敗,一半成功一半失敗每每會形成一些意想不到的業務問題,處理起來也很是麻煩,尤爲是和銀行、金融相關的處理更是如此。數據庫
在Spring中要封裝一個事務的操做,很是簡單,只須要以下幾步便可:ide
將 org.springframework.transaction.support.TransactionTemplate 和 org.springframework.jdbc.datasource.DataSourceTransactionManager 這兩個類的bean注入。
1 <bean id="transactionTemplate" name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate" > 2 <property name="transactionManager" ref="bopsTransactionManager" /> 3 </bean> 4 <bean id="bopsTransactionManager" name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 5 <property name="dataSource" ref="geneBopsDataSource" /> 6 </bean>
1 @Resource(name="transactionTemplate") 2 private TransactionTemplate transactionTemplate;
本例將根據ID刪除計劃和根據計劃ID刪除規則兩個操做綁定到一塊兒,以事務的方式執行。post
1 @Override 2 public Result<Integer> delPlan(long planId) { 3 Integer resultInt= delPlan((int)planId)?1:0; 4 return new Result<Integer>(resultInt,null); 5 } 6 7 private boolean delPlan(final int planIdInt) { 8 try { 9 transactionTemplate.execute(new TransactionCallback() { 10 public Object doInTransaction(TransactionStatus status) { 11 revisedPlanDao.delRevisedPlanById(planIdInt); 12 revisedRuleDao.delRuleByPlanID(planIdInt); 13 return true; 14 } 15 }); 16 } catch (RuntimeException e) { 17 return false; 18 19 } 20 return true; 21 }
好了,事務的處理基本就這樣,還算比較簡單易用,常常還須要使用到SQL的批量處理功能。頻繁的I/O會致使一系列問題,因此在有數據庫的操做時,要計量少地使用I/O操做。批量執行僅一次I/O操做,比單條執行效率高多了。以下代碼所示,咱們在批量向數據庫中插入數據時,能夠這樣使用執行器批量執行,還能夠控制每次容許插入的條數。spa
1 @Override 2 public Long batchInsert(final List<PostAttrSceneRelDO> postAttrSceneRelList) { 3 return (Long) getSqlMapClientTemplate().execute(new SqlMapClientCallback() { 4 5 public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException { 6 executor.startBatch(); 7 for (Iterator<PostAttrSceneRelDO> iterator = postAttrSceneRelList.iterator(); iterator.hasNext();) { 8 PostAttrSceneRelDO postAttrSceneRel = (PostAttrSceneRelDO) iterator.next(); 9 executor.insert("TL_POST_ATTR_REL.insert", postAttrSceneRel); 10 } 11 executor.executeBatch(); 12 return postAttrSceneRelList.size(); 13 } 14 }); 15 }
累積效應遠比一時的靈感重要,哪怕再小的知識點,經時累月,用心經營,也能造成壁壘,許久沒寫東西,深感慚愧。code