Mysql在替换时锁定触发器中的表
我有一个表(Mysql在替换时锁定触发器中的表,mysql,locking,innodb,mysql-5.7,Mysql,Locking,Innodb,Mysql 5.7,我有一个表(table1),我正在对其执行REPLACE语句。 我在插入前的上、插入后的上和删除前的上都有触发器,在这些触发器中我修改了另一个表(表2)。当REPLACE语句和触发器内的操作正在运行时,我不希望任何其他会话编辑table2 我知道我可以在表1上使用锁定表,触发器内的表也会锁定。但是我在一个存储过程中进行修改,因此,我不能使用锁表。(基于) 如何确保table1和table2保持锁定状态,并且在REPLACE语句完成之前,没有使用LOCK TABLES,其他会话无法访问它们 我也读
table1
),我正在对其执行REPLACE
语句。
我在插入前的上、插入后的上和删除前的上都有触发器,在这些触发器中我修改了另一个表(表2
)。当REPLACE
语句和触发器内的操作正在运行时,我不希望任何其他会话编辑table2
我知道我可以在表1
上使用锁定表
,触发器内的表也会锁定。但是我在一个存储过程中进行修改,因此,我不能使用锁表
。(基于)
如何确保table1
和table2
保持锁定状态,并且在REPLACE
语句完成之前,没有使用LOCK TABLES
,其他会话无法访问它们
我也读过。但是不可能从触发器返回一个ResultSet
,而且我已经从存储过程返回了另一个ResultSet
,我不想仅仅因为要锁定表就返回这么大的ResultSet
更新:
以下是触发器中发生的情况的示例:
从表2中选择行1
从表2
根据所选值在表2中插入一行
更新row1
,并根据所选值插入或更新表2中的其他一些行
将另一行插入表2
假设我使用START TRANSACTION
,并假设两个事务都使用相同的行。现在transaction1
和transaction2
已经完成了第二步,这意味着他们已经读取了所需的值,然后transaction1
进入下一步并锁定transaction2
直到transaction1
完全完成,然后transaction2
进入步骤3,但是现在步骤1中选择的值不正确,因为transaction1
已更新row1
。因此,它将插入并更新错误的值
我如何避免这种情况
(此外,如果此场景不可能发生,那么根据触发器中发生的步骤,还会发生哪些其他场景?因为我确信,在使用此代码的同时,来自不同事务的1000多个插入时,会发生错误)为什么要锁定整个选项卡,而不仅仅是受语句影响的行?我猜您使用的是“原子”一词,意思是“不等待锁定”。您不是在使用InnoDB吗<代码>锁表
已通过<代码>替换
已通过;看看你是否可以切换到Idok.@ Pube,因为对<代码> Table 2的修改,插入的行和更新是基于其他行的,所以在修改<代码>表2期间,另一个会话不应该改变任何值,否则Session 1的值会被损坏。BillKarwin我错了,是的,我的意思是其他会话应该等待所有修改发生@RickJames IODKU肯定更好,我应该使用它,但它不会解决我的问题!我仍然希望在触发器内部进行修改,以锁定表和其他会话。因为每个触发器中都有多个插入、选择和更新。这实际上是(可序列化)事务的要点:防止第二个事务t2执行与在t2之前或之后完全运行t1(序列化=其中一个)结果不同的操作。您当前正试图强制t2在t1之后运行(例如,仅因为t1在12:00开始,您就阻止t2在12:01时执行某些在11:59时可以执行的操作,而不会更改t1的结果)。您“只是”需要正确地使用事务(尽管“只是”并非无关紧要),例如,使用适当的隔离级别,进行更新
。。。(并准备好重复t1)。