我有一个以这种形式的数字:2012-01(2012年为当前年份),01只是我数据库中字段的最大值加1,每年该数字重置为0。
但如果有两个用户尝试同时执行相同的操作,则两者的值相同,因此我在数据库中插入两次相同的数字。
我想创建一个序列,但是这需要一个每年重置序列的工作,我宁愿在我得到下一个数字之前有办法锁定 插入完成后释放它?
感谢。
答案 0 :(得分:5)
CREATE UNIQUE INDEX index_name ON table_name(column_name);
或
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE(column_name);
答案 1 :(得分:2)
您没有指定存储用作计数器的字段的位置。但也许可以使用SELECT FOR UPDATE
语句。
在将计数器字段的值增加1之前,您可以使用SELECT FOR UPDATE
锁定该记录。然后更新计数器。
这样的事情,假设表只有1条记录:
SELECT *
FROM CounterTable
FOR UPDATE;
UPDATE CounterTable
SET Counter = Counter + 1;
COMMIT;
如果一个会话(用户)已完成SELECT FOR UPDATE
但尚未提交或回滚,则执行SELECT FOR UPDATE
的其他会话(用户)将阻止等待获取锁定。这可以防止两个用户获得相同的号码。