2012-04-05 150 views
1

我有一个以下格式的数字:2012-01(2012作为当前年份),01只是我数据库中字段的最大值增加1,并且每年这个数字被重置为0.防止在oracle数据库中插入相同的值两次

但是如果有两个用户试图在同一时间做同样的操作,这两个值都是相同的,因此我得到了两次在我的数据库中插入的相同数字。

我想创建一个序列,但需要一个每年重置序列的工作,而且我希望在获得下一个数字之前有一种锁定方法,并且在插入完成后释放它?

谢谢。

+0

请看这个Ask Tom链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4343369880986由于您试图重置序列,你基本上正在尝试一种“无间隙”的方法,由于其性能影响(锁定行以确保并发性不能很好地扩展),因此非常不鼓励。 – 2012-04-05 19:45:46

回答

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将阻止等待能够获得锁定。这可以防止两个用户获得相同的号码。

+0

非常感谢,这工作得很好 – 2012-04-06 12:41:56

5

CREATE UNIQUE INDEX index_name ON table_name(column_name);

ALTER TABLE TABLE_NAME ADD CONSTRAINT constraint_name命令UNIQUE(列);

+0

谢谢,这似乎很酷,但我可以捕获这个特殊的异常(唯一违反常量)插入下一行,我的列再次增加? – 2012-04-05 17:14:16

+1

一般不建议使用异常作为控制程序流程的手段。 – 2012-04-05 19:34:07

+0

@RemkoJansen,我不一定同意你的“一般”,但在这种情况下,你是正确的。 OP需要使用一个序列,如果他们关心是否存在PK违规行为这么少。 – Ben 2012-04-05 19:51:03

相关问题