ID|RID|SID|Name
1| 1 | 1 |Alpha
2| 1 | 2 |Beta
3| 2 | 1 |CharlieID是自动递增的唯一的,不是这里的问题。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,问题是在插入新记录时如何使用该值?
我不能简单地运行两个查询,因为这可能会导致重复,因此需要以某种方式锁定表,理想情况下是只写。这样做的正确方法是什么?
发布于 2014-03-24 17:06:24
首先,您应该严格按照您希望的方式约束您的数据,因此在(RID, SID)上放置一个惟一的组合索引。
对于您的问题,您应该启动一个事务(BEGIN),然后在所需的行上放置一个排它锁,这会阻止其他连接对这些行的所有访问(而不是整个表,这会降低性能!):
SELECT .... FOR UPDATE这将以独占方式锁定所有选定的行。此外,您应该使用而不是 READ UNCOMMITTED作为隔离级别。您可以查看in the manual如何检查当前隔离级别以及如何更改此级别。REPEATABLE READ是默认的隔离级别,在这里就可以了。
然后插入新查询并提交(COMMIT)事务。
这应该完全禁止重复,因为您创建了一个唯一的索引,并且它还应该禁止您的脚本只是失败并显示唯一检查失败的错误消息,而是等待其他脚本完成并插入下一行。
https://stackoverflow.com/questions/22601991
复制相似问题