MYSQL INNODB手动增加锁定

时间:2014-03-24 05:50:02

标签: php mysql sql innodb increment

ID|RID|SID|Name
 1| 1 | 1 |Alpha
 2| 1 | 2 |Beta
 3| 2 | 1 |Charlie

ID是自动递增的唯一,而不是这里的问题。 RID将数据集合在一起,我需要一种方法来使每个RID'组的SID唯一。这种结构是正确的,我期待有人说它将它分成多个表格,这不是一个选项(它的分类分类)。

如图所示,在RID 1下,SID从1增加到2,但当RID变为2时,SID为1.

我有代码来获取下一个值:SELECT IFNULL(MAX(SID),0)+1 AS NextVal FROM t WHERE RID=1,问题是如何在插入新记录时使用该值?

我不能简单地运行两个查询,因为这会导致重复,所以表格需要被锁定,理想情况下只能写入。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,您应该将数据限制为完全符合您希望的方式,因此请在(RID, SID)上添加唯一的组合索引。

对于您的问题,您应该启动一个事务(BEGIN),然后对您需要的行进行独占锁定,这会阻止对这些行的所有访问以进行其他连接(不是整个表,这对于性能):

SELECT .... FOR UPDATE

这将独占锁定所有选定的行。此外,您应使用READ UNCOMMITTED作为隔离级别。您可以查看in the manual如何检查当前隔离级别以及如何更改此级别。  REPEATABLE READ是默认的隔离级别,在这里没问题。

然后插入新查询并提交(COMMIT)交易。

这应该完全禁止重复,因为您创建了一个唯一索引,它也应该禁止您的脚本失败,并显示唯一检查失败的错误消息,而是等待其他脚本完成并插入下一行。