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     }

         

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

  • 相关阅读:
    javascript入门教程笔记
    杭电2025
    杭电 2024
    杭电2019
    UEditor编辑器上传图片开发流程
    js操作textarea方法集合
    ueditor编辑器和at.js集成
    js分页算法
    js获取url中的参数
    第7章函数表达式笔记
  • 原文地址:https://www.cnblogs.com/XiaoHDeBlog/p/6901038.html
Copyright © 2011-2022 走看看