有这样一个需求,插入一条数据后才能向另一个表插入日志数据。而且要判断第一次插入成功后才插入日志数据。但是插入不是普通的插入
  <insert id="BatchAddForZh" parameterClass="ParamContext">
  <![CDATA[
        insert into t_salary (XXX)

SELECT * from xxx 有条件 ]]>
<selectKey resultClass="java.lang.Integer" type="post" keyProperty="pkId">
SELECT LAST_INSERT_ID() 
</selectKey>
  </insert>SELECT LAST_INSERT_ID()---- 根据返回值有无来插入日志 @Transactional
public void batchAddSalary(Integer accId) {
salaryDao.batchAdd(accId);//这个调用以上的sql
Workstate workstate=new Workstate();
workstate.setAccId(accId);
workstate.setCommitDate(HrpaDateUtil.getCurrentDate());
workstateDao.updateWorkstate(workstate);
}
但是 SELECT LAST_INSERT_ID()返回 workstateDao执行的主键值,这个怎么配置嵌套事务呢! 配置Dao的事务似乎又不好看。有什么高手想法的出点子!分是大大的有呀!!如果配置Dao事务,你怎么做,如果做串联,你怎么做,具体代码最好!

解决方案 »

  1.   

    我觉得你的思路有问题, 这个不需要配事务啊,一个oracle的触发器就解决问题了啊。要是非要用程序,建议你insert后根据返回的值来判断是否记录日志, jta事务放service层
      

  2.   

    我也觉得用oracle触发器就可以的,还是改变一个方式吧,也希望高手参与,为楼主顶一下!!
      

  3.   

    还可以在service层自己手动的控制。
      

  4.   

    就是,如果用Spring控制的话,就在Service层控制,建议楼主要妥善处理长事务的问题
      

  5.   

    你使用一条INSERT语句插入多个行,  LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。而且LAST_INSERT_ID针对与connect是完全绑定的,不存在共享于其他connect,
    你这里需要使用两次操作,即dao中调用ibatis执行insert后,执行query查询LAST_INSERT_ID(),
    如果
    1.LAST_INSERT_ID() 返回0则表示当前插入不成功,即为失败,不写日志
    2.LAST_INSERT_ID() 返回大于0表示当前插入成功,写日志。
    3.如果insert执行过程中出现异常,LAST_INSERT_ID的query压根儿就不会执行啦,
      

  6.   

    你要配置什么事务?requiered ? 个人觉得你的select语句是多余的!
    你要根据是否插入来判断是否插入日记,其实很好理解啊!
    这个你一定要配置事务,毕竟你要是执行到一半是肯定不行的!
    个人认为只要在servers、manager层设置好事务,若是你有接口,就在接口包上面设置!(面向接口编程)
    这样你如果插入不成功,事务就回滚了!
    回滚后,你插入日记也就执行不了了! 所以,你的select语句 是多余的!!!!
      

  7.   


    看看这些人的回复,基本都是没有什么价值的信息!你的有点用,但是并没有使用到根本!,LAST_INSERT_ID()返回的是一个完整事务并且线程安全的最后插入的ID。只有事务提交才会产生返回值。事务
     使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
     另外一个插入    
    事务以上只是一般的想法,那好加上判断:事务
     使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
     if(返回大于零){//但是这个前提是什么?是事务提交
      另外一个插入 
     }   
    事务最后只能是:但是如下怎么配置?O,DAO配置事务?事务
      使用嵌套事务
      使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
      使用嵌套事务  另外一个插入 
      
    事务如果是JDBC写这些也许很容易!
      

  8.   

    个人认为只要在servers、manager层设置好事务,若是你有接口,就在接口包上面设置!