表A 的update操作触发 tri_a,在tri_a中delete表B一行,进而触发tri_b,修改表C
但是在tri_b中要访问表A,于是出现变异表问题采用两个触发器和一个包来解决:
一个行级触发器tri_b_before获得:OLD值,并把它存在包PG_TEST的变量中,然后使用语句级触发器tri_b_after和PG_TEST中的变量查询表A中的数据。问题是:如何保证PG_TEST中的变量不出现并发更新的问题
举例:
1.client1 update表A中的一条数据
2.client2 update表A中的另一条数据
3.触发client1 tri_b_before
4.client1把:old存放在PG_TEST中
5.触发client2 tri_b_before
6.client2把:old存放在PG_TEST中(PG_TEST中的数据被覆盖了***这里出问题)
7.触发client1 tri_b_after得到:OLD值更新C表(这时的数据已经不对了)
8.触发client2 tri_b_after得到:OLD值更新C表
请问:这种情况如何处理,有办法锁定一个包或其中的变量吗
(我查了一下,好像dbms_lock可以,但是需要授权:grant execute on dbms_lock to username,授权后我这里的触发器还是不能编译通过)