我有一个具有序列号的表.此序列号将更改,并且引用自动编号将不起作用.我担心触发器的值会发生碰撞.如果两个事务同时读取.
我已经在3个连接上运行了模拟测试,每个记录约100万条,没有碰撞.
CREATE TABLE `aut` (
`au_id` int(10) NOT NULL AUTO_INCREMENT,
`au_control` int(10) DEFAULT NULL,
`au_name` varchar(50) DEFAULT NULL,
`did` int(10) DEFAULT NULL,
PRIMARY KEY (`au_id`),
KEY `Did` (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
TRIGGER `binc_control` BEFORE INSERT ON `aut`
FOR EACH ROW BEGIN
SET NEW.AU_CONTROL = (SELECT COUNT(did)+1 FROM aut WHERE did = NEW.did);
END;
解决方法:
是的,如果两个会话同时运行触发器,则这会受到竞争条件的影响.您不应该使用此解决方案.
它可能不会在测试期间发生,但您可以假设它将在生产期间发生.