我制作了一个这样的映射器 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 > 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 > 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 中处理它的最佳方法是什么?有没有办法捕捉到这种异常?
非常感谢您的时间和帮助!
格兰德