关于MySQL TRIGGER的并发UPDATE

时间:2017-03-08 21:14:23

标签: mysql

我在MySQL中有这个TRIGGER:

CREATE DEFINER = CURRENT_USER TRIGGER `test`.`view_AFTER_INSERT` AFTER INSERT ON `views` FOR EACH ROW
BEGIN
UPDATE metrics SET met_nu_vie = met_nu_vie + 1 WHERE usp_id = NEW.usp_id;   
END

基本上,当用户从Web应用程序中的另一个用户收到“视图”时,系统会在表“视图”中创建一个新行,并在插入后,在另一个表(度量标准)中增加一个计数器值。

我的问题是:如果用户从10个不同的用户收到10个并发视图......¿这个更新安全吗?

我架构上的所有表都是INNODB。

感谢。

1 个答案:

答案 0 :(得分:0)

如果用户收到X个并发视图,那么计数器将使用问题中的更新语句增加X.

正如innodb locks上的mysql手册所解释的那样:

  

UPDATE ... WHERE ...在每条记录上设置独占下一键锁定   搜索遭遇。但是,只需要索引记录锁定   对于使用唯一索引锁定行以搜索a的语句   独特的一行。

关于独占锁的Mysql手册说:

  

如果事务T1在行r上持有独占(X)锁,则为请求   来自某个不同的事务T2,用于r上任一类型[独占或共享]的锁定   不能立即授予。相反,事务T2必须等待   事务T1释放其对行r的锁定。

总结一下:查看者可能在您的应用程序级别并发,但在mysql级别更新是使用独占锁序列化的。