【发布时间】:2015-04-04 10:18:35
【问题描述】:
我想知道是否有必要在最可能的并发环境中使用锁定以及如何在以下情况下。将MySQL database server 与InnoDB 引擎一起使用
假设我有一张桌子
CREATE TABLE `A` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`m_id` INT NOT NULL, -- manual id
`name` VARCHAR(10)
) ENGINE=INNODB;
以及程序
CREATE PROCEDURE `add_record`(IN _NAME VARCHAR(10))
BEGIN
DECLARE _m_id INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
SELECT (`m_id` + 1) INTO _m_id FROM `A` WHERE `id` = (SELECT MAX(`id`) FROM `A`);
INSERT INTO `A`(`m_id`, `name`) VALUES(_m_id, _NAME);
COMMIT;
END$$
如您所见,我正在手动增加m_id,并发事务很可能发生。如果数据库可能处于不一致状态,我无法确定。同样使用FOR UPDATE 和LOCK IN SHARE MODE 在这种情况下没有意义,因为事务处理新记录并且与特定行的更新无关。进一步LOCK TABLES在存储过程中是不允许的,是相当不够的。
所以,我的问题是如果可能实际发生,如何避免标记场景中的不一致状态。任何建议将不胜感激
【问题讨论】:
-
手动 id 有另一个表 - 即只有一个自动增量字段的表,并从中获取您的 m_id
标签: mysql stored-procedures transactions innodb consistency