myBatis3.1.1关于update语句的XML文件

时间:2013-08-13 18:24:38

标签: mybatis

我制作了一个这样的映射器XML文件:

<update id="feeCalculation" parameterType="map">
 declare @cnt int

insert into #tempA
select ... from ... where ...

insert into #tempA
select ... from ... where ...

insert into #tempB
select ... from ... where ...

insert into #tempB
select ... from ... where ...

insert into #tempC ...

select @cnt=count(*) from #tempA where ...

if @cnt &gt; 0

begin 

insert into #tempD ...

update #tempA set...

update #tempA set...

update #tempB set...

update #tempD set...

end

update #tempC set...

</update>

因为计算涉及使用多个会话临时表的许多步骤,所以我将它们全部放在一个事务中。结果将在#tempC和#tempD中,将在下次调用时获取。

使用“正常”数据大小,只需一次调用'feeCalculation()'即可。但是当数据大小增加时,我遇到了一个错误 - 它在中间的某个地方失败了所以它没有抛出任何异常就回滚了(我已经尝试{} catch {}。当我将单个呼叫分成两个呼叫时,它起作用了:

<update id="feeCalculation1" parameterType="map">

declare @cnt int

insert into #tempA
select ... from ... where ...

insert into #tempA
select ... from ... where ...

insert into #tempB
select ... from ... where ...

insert into #tempB
select ... from ... where ...

insert into #tempC ...

</update>
<update id="feeCalculation2" parameterType="map">

select @cnt=count(*) from #tempA where ...

if @cnt &gt; 0

begin 

insert into #tempD ...

update #tempA set...

update #tempA set...

update #tempB set...

update #tempD set...

end

update #tempC set...

</update>

不知何故,它似​​乎是一个事务内存问题。 这就像是在猜测我使用XML语句,如果它是由存储过程完成的话你不会担心,只是按正确的顺序堆积所有的SQL。

在Java / myBatis中处理它的最佳方法是什么?反正有没有抓住这种例外?

非常感谢您的时间和帮助!

Glander

1 个答案:

答案 0 :(得分:0)

通过将设置添加到myBatis Config.xml而不更改代码来解决问题,但我仍然无法完全理解原因。

           <settings>  
                <setting name="defaultExecutorType" value="BATCH"/>  
          </settings>

Glander