Spring 事务处理

简介:spring

     在实际的业务中,咱们每每须要将一些DB的写操做绑定到一块儿造成一个“事务”,作到要么所有成功,要么所有失败,一半成功一半失败每每会形成一些意想不到的业务问题,处理起来也很是麻烦,尤为是和银行、金融相关的处理更是如此。数据库

     在Spring中要封装一个事务的操做,很是简单,只须要以下几步便可:ide

1、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>

 

2、在应用的具体class中定义成员类

1 @Resource(name="transactionTemplate")
2 private TransactionTemplate  transactionTemplate;

 

3、定义事务的具体操做,实现doInTransaction方法

   本例将根据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

相关文章
相关标签/搜索