zoukankan      html  css  js  c++  java
  • 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     }

         

      累积效应远比一时的灵感重要,哪怕再小的知识点,经时累月,用心经营,也能形成壁垒,许久没写东西,深感惭愧。

  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/XiaoHDeBlog/p/6901038.html
Copyright © 2011-2022 走看看