釋義:編程式事務和聲明式事務的區別java
編程式事務須要在代碼中寫明事務的提交commit、回滾rollback,如在執行某方法時須要事務處理,你須要在方法開始時開啓事務,處理完後,在方法結束時候,關閉事務。入侵性較強,但處理粒度細。數據庫
聲明式事務須要在配置文件中定義事務的關注點和切入點,以及何時須要事務,在系統有須要的時候會自動提交,自動回滾。或者在須要事務的方法上添加註解控制事務。編程
問題:公司業務需求,經過數據接口讀取須要的數據後往oracle數據庫中插入1000萬條甚至更多數據,循環批量插入,若是使用Spring的事務管理,定義事務傳播屬性爲required(propagation="REQUIRED")時,每次循環都會把insert加入到同一個事務中,直到循環結束事務才提交,當數據量過大時,就會出現數據庫鏈接池就會不足(一直沒有釋放)的問題。oracle
解決:使用編程式事務,每次循環結束都執行commit,提交事務。app
代碼: @Autowired DruidDataSource dataSource; //Spring配置文件中的dataSource @Autowired TestBeanMapper testBeanMapper; @Override public int inertBatch(List<TestBean> list) throws Exception{ DefaultTransactionDefinition def = new DefaultTransactionDefinition(); //事務的傳播屬性 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource); TransactionStatus status = txManager.getTransaction(def); Int result = 0; Try{ Result = testBeanMapper.insertBatch(list); }catch(Exception e){ txManager.rollback(status); Int result = 0; return reuslt; } txManager.commit(status); return result; }
本文使用的是SpringMVC+Mybatis的beanMapper,且事務的隔離級別爲默認。ide
編程式事務和Spring的聲明式事務混合使用時,注意Spring的配置文件中關於事務的切入點配置必定不要包含編程式事務所在的package,否則會默認使用Spring的事務管理。學習
參考(學習借鑑):ui
一、Spring聲明式事務:http://java.9sssd.com/javafw/art/1215spa
二、Jdbc編程式事務:http://jinnianshilongnian.iteye.com/blog/1441271code