Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql在替换时锁定触发器中的表_Mysql_Locking_Innodb_Mysql 5.7 - Fatal编程技术网

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)。