我有一个以下格式的数字:2012-01(2012作为当前年份),01只是我数据库中字段的最大值增加1,并且每年这个数字被重置为0.防止在oracle数据库中插入相同的值两次
但是如果有两个用户试图在同一时间做同样的操作,这两个值都是相同的,因此我得到了两次在我的数据库中插入的相同数字。
我想创建一个序列,但需要一个每年重置序列的工作,而且我希望在获得下一个数字之前有一种锁定方法,并且在插入完成后释放它?
谢谢。
我有一个以下格式的数字:2012-01(2012作为当前年份),01只是我数据库中字段的最大值增加1,并且每年这个数字被重置为0.防止在oracle数据库中插入相同的值两次
但是如果有两个用户试图在同一时间做同样的操作,这两个值都是相同的,因此我得到了两次在我的数据库中插入的相同数字。
我想创建一个序列,但需要一个每年重置序列的工作,而且我希望在获得下一个数字之前有一种锁定方法,并且在插入完成后释放它?
谢谢。
您不指定存储用作计数器的字段的位置。但也许可以使用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-06 12:41:56
CREATE UNIQUE INDEX index_name ON table_name(column_name);
或
ALTER TABLE TABLE_NAME ADD CONSTRAINT constraint_name命令UNIQUE(列);
谢谢,这似乎很酷,但我可以捕获这个特殊的异常(唯一违反常量)插入下一行,我的列再次增加? – 2012-04-05 17:14:16
一般不建议使用异常作为控制程序流程的手段。 – 2012-04-05 19:34:07
@RemkoJansen,我不一定同意你的“一般”,但在这种情况下,你是正确的。 OP需要使用一个序列,如果他们关心是否存在PK违规行为这么少。 – Ben 2012-04-05 19:51:03
请看这个Ask Tom链接:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4343369880986由于您试图重置序列,你基本上正在尝试一种“无间隙”的方法,由于其性能影响(锁定行以确保并发性不能很好地扩展),因此非常不鼓励。 – 2012-04-05 19:45:46