更换

问题描述

我有一个表(table1),并且正在执行REPLACE语句。 我在BEFORE INSERTAFTER INSERTBEFORE DELETE的该表上有触发器,在这些触发器中,我修改了另一个表(table2)。在运行table2语句和触发器内部的操作时,我不希望任何其他会话编辑REPLACE

我知道我可以在LOCK TABLES上使用table1,并且触发器内的表也将锁定。但是我正在存储过程中进行修改,因此,我不能使用LOCK TABLES。 (基于this

如何确保table1table2保持锁定状态,并且在REPLACE语句完成之前不使用LOCK TABLES之前,没有其他会话可以访问它们?

我也读过this。但是不可能从触发器中返回一个ResultSet,而且我已经从存储过程中返回了另一个ResultSet,并且我不想返回这么大的ResultSet只是因为我想锁定桌子。

更新:

以下是触发器中发生的情况的一个示例:

  1. row1中选择table2
  2. row2中选择table2
  3. 根据所选值在table2中插入一行
  4. 根据所选值更新row1并从table2插入或更新其他行
  5. 将另一行插入table2

比方说,我使用START TRANSACTION并假定两个事务都在同一行中工作。现在transaction1transaction2已完成第二步,这意味着它们已读取所需的值,然后transaction1进入下一步并锁定transaction2直到{{1} }完全完成,然后transaction1进入步骤3,但是现在步骤1中选择的值不正确,因为transaction2已更新transaction1。因此,它将使用错误的值进行插入和更新。

如何避免这种情况?

(如果这种情况是不可能发生的,那么根据触发器中正在发生的步骤,还会发生其他什么情况?因为我确定当使用此代码同时插入1000个以上的代码时,会发生错误不同交易的时间)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...