鉴于以下内容:
SQL Server中的数据库对象:
create table t (c int);
create table t2 (c int);
create table t3 (c int);
create table t4 (c int);
create trigger tr on t after update as begin
update t2 set c = c;
end;
create trigger tr2 on t2 after update as begin
begin try
insert into t4 values (1);
select null from t3 with (updlock, nowait);
end try
begin catch
-- How to recover if t3 can't be locked?
end catch;
end;
同时运行的Java程序:
t3
相同的方式锁定tr2
的P1,但在终止之前不会放弃锁定。t
。 P2似乎无声地失败(即没有SQLException
s),但没关系。更重要的是,由于t
中t4
的锁定失败,因此t3
和tr2
未进行任何更改。我试图在锁定之前创建一个保存点,但回滚到catch子句中的保存点也失败了。看起来锁定失败导致交易成为uncommittable。有没有什么方法可以在保留迄今所做的更改的同时从中恢复?或者,UPDLOCK
NOWAIT
是否有替代iframe
不会导致交易无法承受?