- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有与 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/
我是一名优秀的程序员,十分优秀!