0

我制作了一个这样的映射器 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 中处理它的最佳方法是什么?有没有办法捕捉到这种异常?

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

格兰德

4

1 回答 1

0

通过在不更改代码的情况下将设置添加到 myBatisConfig.xml 解决了这个问题,但我仍然无法完全理解为什么。

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

格兰德

于 2013-08-21T20:23:21.633 回答