1

我有一个这样的数字:2012-01(2012 年作为当年),01 只是我的数据库中一个字段的最大值增加 1,并且每年该数字都重置为 0。

但是如果有两个用户同时尝试执行相同的操作,则两者的值相同,因此我在我的数据库中插入了两次相同的数字。

我想创建一个序列,但这需要每年重置序列的工作,如果有办法在我获得下一个数字之前进行锁定并在插入完成后释放它,我会更喜欢?

谢谢。

4

2 回答 2

5

CREATE UNIQUE INDEX index_name ON table_name (column_name);

或者

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name);

于 2012-04-05T17:09:47.830 回答
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将阻塞等待能够获得锁。这可以防止两个用户获得相同的号码。

于 2012-04-05T19:30:05.447 回答