有这样一个需求,插入一条数据后才能向另一个表插入日志数据。而且要判断第一次插入成功后才插入日志数据。但是插入不是普通的插入
<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事务,你怎么做,如果做串联,你怎么做,具体代码最好!
<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事务,你怎么做,如果做串联,你怎么做,具体代码最好!
你这里需要使用两次操作,即dao中调用ibatis执行insert后,执行query查询LAST_INSERT_ID(),
如果
1.LAST_INSERT_ID() 返回0则表示当前插入不成功,即为失败,不写日志
2.LAST_INSERT_ID() 返回大于0表示当前插入成功,写日志。
3.如果insert执行过程中出现异常,LAST_INSERT_ID的query压根儿就不会执行啦,
你要根据是否插入来判断是否插入日记,其实很好理解啊!
这个你一定要配置事务,毕竟你要是执行到一半是肯定不行的!
个人认为只要在servers、manager层设置好事务,若是你有接口,就在接口包上面设置!(面向接口编程)
这样你如果插入不成功,事务就回滚了!
回滚后,你插入日记也就执行不了了! 所以,你的select语句 是多余的!!!!
看看这些人的回复,基本都是没有什么价值的信息!你的有点用,但是并没有使用到根本!,LAST_INSERT_ID()返回的是一个完整事务并且线程安全的最后插入的ID。只有事务提交才会产生返回值。事务
使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
另外一个插入
事务以上只是一般的想法,那好加上判断:事务
使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
if(返回大于零){//但是这个前提是什么?是事务提交
另外一个插入
}
事务最后只能是:但是如下怎么配置?O,DAO配置事务?事务
使用嵌套事务
使用返回值的插入//这个失败,就不能另外一个插入了,但是用的表复制,根本不会失败,最多返回0
使用嵌套事务 另外一个插入
事务如果是JDBC写这些也许很容易!