问题描述
我有一个表(table1
),并且正在执行REPLACE
语句。
我在BEFORE INSERT
,AFTER INSERT
和BEFORE DELETE
的该表上有触发器,在这些触发器中,我修改了另一个表(table2
)。在运行table2
语句和触发器内部的操作时,我不希望任何其他会话编辑REPLACE
。
我知道我可以在LOCK TABLES
上使用table1
,并且触发器内的表也将锁定。但是我正在存储过程中进行修改,因此,我不能使用LOCK TABLES
。 (基于this)
如何确保table1
和table2
保持锁定状态,并且在REPLACE
语句完成之前不使用LOCK TABLES
之前,没有其他会话可以访问它们?
我也读过this。但是不可能从触发器中返回一个ResultSet
,而且我已经从存储过程中返回了另一个ResultSet
,并且我不想返回这么大的ResultSet
只是因为我想锁定桌子。
更新:
以下是触发器中发生的情况的一个示例:
- 从
row1
中选择table2
- 从
row2
中选择table2
- 根据所选值在
table2
中插入一行 - 根据所选值更新
row1
并从table2
插入或更新其他行 - 将另一行插入
table2
比方说,我使用START TRANSACTION
并假定两个事务都在同一行中工作。现在transaction1
和transaction2
已完成第二步,这意味着它们已读取所需的值,然后transaction1
进入下一步并锁定transaction2
直到{{1} }完全完成,然后transaction1
进入步骤3,但是现在步骤1中选择的值不正确,因为transaction2
已更新transaction1
。因此,它将使用错误的值进行插入和更新。
如何避免这种情况?
(如果这种情况是不可能发生的,那么根据触发器中正在发生的步骤,还会发生其他什么情况?因为我确定当使用此代码同时插入1000个以上的代码时,会发生错误不同交易的时间)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)