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
,问题是如何在插入新记录时使用该值?
我不能简单地运行两个查询,因为这会导致重复,所以表格需要被锁定,理想情况下只能写入。这样做的正确方法是什么?
答案 0 :(得分:1)
首先,您应该将数据限制为完全符合您希望的方式,因此请在(RID, SID)
上添加唯一的组合索引。
对于您的问题,您应该启动一个事务(BEGIN
),然后对您需要的行进行独占锁定,这会阻止对这些行的所有访问以进行其他连接(不是整个表,这对于性能):
SELECT .... FOR UPDATE
这将独占锁定所有选定的行。此外,您应不使用READ UNCOMMITTED
作为隔离级别。您可以查看in the manual如何检查当前隔离级别以及如何更改此级别。
REPEATABLE READ
是默认的隔离级别,在这里没问题。
然后插入新查询并提交(COMMIT
)交易。
这应该完全禁止重复,因为您创建了一个唯一索引,它也应该禁止您的脚本失败,并显示唯一检查失败的错误消息,而是等待其他脚本完成并插入下一行。