gpt4 book ai didi

mysql - 这个MySQL触发器是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-29 23:08:48 32 4
gpt4 key购买 nike

我有与 here 所描述的相同的问题,而且我认为答案 https://stackoverflow.com/a/22343265/297487 是一个很好的解决方案,但我对此答案还有另一个问题。

以下触发器(从答案复制)是线程安全的吗?我的意思是,如果两个并发记录插入表中,“优先级”列(如问题中所述)是否具有一致的值(与 id 的值相同)?

delimiter //
drop trigger if exists bi_table_name //

create trigger bi_table_name before insert on table_name
for each row begin
set @auto_id := ( SELECT AUTO_INCREMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='table_name'
AND TABLE_SCHEMA=DATABASE() );
set new.priority= @auto_id;
end;
//

delimiter ;

我们如何解释“for every row”子句?假设 MySQL 要插入两个并发行。这个触发器是如何工作的?

一种解释如下:

MySQL 锁定表,在插入一行(并发记录之一)之前,MySQL 触发器启动并获取当前的 AUTO_INCRMENT 值并将其设置为“优先级”列,然后插入一条记录。之后MySQL开始插入另一条记录,然后同样的情况适用于新记录。

另一种解释可能如下:

当两条并发记录插入MySQL时,MySQL会锁定表,然后在插入两条并发记录之前,触发器启动,“for every row”子句在两条记录之间迭代,并将“priority”列值设置为相同的值,然后在数据库中插入两条并发记录。在这种情况下,触发器无法按预期工作。

以上解释哪一项是正确的?

更新:

我有下表:

    CREATE TABLE `t_file` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_persian_ci NOT NULL,
`p_name` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `p_name_2` (`p_name`)

) ENGINE=InnoDB AUTO_INCREMENT=206284 DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci;

我想在插入行时插入与 id 相同的 p_name 值。

设置p_name值的trigger如下(从您的代码复制)

  delimiter $$
drop trigger if exists file_p_name $$

create trigger file_p_name before insert on t_file
for each row begin
set @id := ( SELECT AUTO_INCREMENT
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='t_file'
AND TABLE_SCHEMA=DATABASE() );
set new.p_name= @id;
end;
$$

delimiter ;

在我们的应用程序中,我用try catch包围插入t_file表的代码,几乎总是一切正常,但有时(在并发插入 >t_file 表),我在应用程序日志中看到以下异常:

   SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry \'387456\' for key \'p_name_2\''

看来触发器没有按预期工作,或者也许我错了!!!

最佳答案

answer referred in your question这是我不久前发布的。

在“For Each Row”中,NEW 是在上下文中插入的相应的新行。 set new.xxx 仅适用于该行,但不适用于'for all rows' batch。所以不会有任何碰撞,也不应该出现失败的问题。

我也回答过类似的问题 How does “for each row” work in triggers in mysql? 。请仔细阅读答案中给出的示例。

引用文档:

关于mysql - 这个MySQL触发器是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28168477/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com