Spring 事务处理
简介:
在实际的业务中,我们往往需要将一些DB的写操作绑定到一起形成一个“事务”,做到要么全部成功,要么全部失败,一半成功一半失败往往会造成一些意想不到的业务问题,处理起来也非常麻烦,尤其是和银行、金融相关的处理更是如此。
在Spring中要封装一个事务的操作,非常简单,只需要如下几步即可:
一、bean 配置
将 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>
二、在应用的具体class中定义成员类
1 @Resource(name="transactionTemplate") 2 private TransactionTemplate transactionTemplate;
三、定义事务的具体操作,实现doInTransaction方法
本例将根据ID删除计划和根据计划ID删除规则两个操作绑定到一起,以事务的方式执行。
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操作,比单条执行效率高多了。如下代码所示,我们在批量向数据库中插入数据时,可以这样使用执行器批量执行,还可以控制每次允许插入的条数。
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 }
累积效应远比一时的灵感重要,哪怕再小的知识点,经时累月,用心经营,也能形成壁垒,许久没写东西,深感惭愧。