Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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_Sql_Database_Triggers_Locks - Fatal编程技术网

mysql触发器的锁

mysql触发器的锁,mysql,sql,database,triggers,locks,Mysql,Sql,Database,Triggers,Locks,我在mysql数据库中的表上有一个BEFORE INSERT触发器。它所做的是: 从当前表中选择几个条目。 使用new.columnname将它们与要插入的值相匹配 如果发现值之间存在重叠,请通过以下方式取消插入查询: set msg=预订已存在; 信号sqlstate“45000”设置消息\u TEXT=msg 如果没有发现重叠,则让查询完成 但是,触发器没有像我预期的那样工作,因为在极少数情况下,它会忽略重叠的值。我能想到的唯一可能的情况是: 正在执行两个具有重叠值的INSERT查询,它们之

我在mysql数据库中的表上有一个BEFORE INSERT触发器。它所做的是:

从当前表中选择几个条目。 使用new.columnname将它们与要插入的值相匹配 如果发现值之间存在重叠,请通过以下方式取消插入查询:

set msg=预订已存在; 信号sqlstate“45000”设置消息\u TEXT=msg

如果没有发现重叠,则让查询完成

但是,触发器没有像我预期的那样工作,因为在极少数情况下,它会忽略重叠的值。我能想到的唯一可能的情况是:

正在执行两个具有重叠值的INSERT查询,它们之间的时差为微秒。 第一个触发器运行并在表上创建一个读锁以选择值。没有发现重叠,因此它释放读锁并创建写锁,因此现在可以完成插入查询。同时,第二个触发器创建其读锁以选择值并选择现有值。第一个触发器尚未将其值写入表中。 然后,第一个触发器将其值写入表中。然后第二个触发器写入它的值,因为它也没有发现任何重叠。 我已经多次同时运行两个这样的查询进行了测试,但到目前为止,这种情况只发生过一次。但它仍然存在,所以我需要一种方法来确保它不再发生

在我看来,一种可能的情况是在运行INSERT查询之前显式锁定表

因此,交易将如下所示:

LOCK TABLE t WRITE;
LOCK TABLE t READ;
INSERT INTO t ....;
UNLOCK TABLE t;
在这种情况下,我的问题是:

如果现在我同时执行此事务,第二个事务将排队还是返回错误


任何输入都会有帮助。谢谢大家!

那么如何选择一些条目,标准是什么?我认为使用BEFORE INSERT触发器可能很难管理。如果您的系统试图同时插入数千行或数百万行,该怎么办?您必须锁定表以读取现有记录,并让INSERT语句等待多长时间?这取决于您选择的查询和现有记录。数据库的性能可能会受到影响。也许在生成INSERT语句之前执行验证可以避免使用触发器和锁。