2

I have a table with fields: name|...|start_date|end_date

My code now is:

select .... 'check for period intersection
insert .... 'if check succesfull insert new row

This code in one transaction. When two users try to insert new record in the same time with same fields(and periods intersects) two records inserted. But I want to avoid that inserting. First user must insert, other user must get conflict. How can I do it ?

P.S. I use IBM DB2

4

3 回答 3

0

结合一些错误提示,听起来MERGE正是您想要的。我假设您在 Linux/Unix/Windows 上使用 DB2,但MERGE自 v9.1 以来也一直在大型机 DB2 上。

MERGE INTO YOUR_TABLE YT
USING (
        VALUES ('val1', 'val2', 'val3')
    ) MG(v1, v2, v3)
 ON (TY.v1 = MG.v1)
WHEN MATCHED 
    SIGNAL SQLSTATE '70001'
    SET MESSAGE_TEXT = 'Record already exists!'
WHEN NOT MATCHED THEN
   INSERT(v1, v2, v3)
   VALUES(MG.v1, MG.v2, MG.v3
ELSE IGNORE;

USING子句可以与提供的值一起使用(就像我在这里一样),或者它可以是一个子选择。我在上面链接的信息中心的合并页面上还有其他示例。

于 2012-05-23T14:05:58.797 回答
0

您可以使用英国或选择更新:

select .... 'check for period intersection FOR UPDATE WITH RS USE AND KEEP UPDATE LOCKS

更新:尝试在选择之前锁定整个表:

LOCK TABLE TABLE_NAME IN EXCLUSIVE MODE

这样,第二个事务在选择之前等待前一个事务提交。EXCLUSIVE MODE 也会锁定 select 语句,而不仅仅是更新和插入。

更新 2:如果“检查期间交叉点”仅使用与您插入的表相同的表中的列,则不要选择向表中添加约束检查。请参阅http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.admin.doc%2Fdoc%2Ft0004984.htm

于 2012-05-23T10:52:04.433 回答
0

插入从选择中获取数据的查询。在选择中选择的值将需要插入的数据。where 子句可以检查条件,如果检查失败,则应返回 null。所以如果我想输入 id 5 不在表中

  Insert into test1(val) select "test" from (select case when id = 5 then null else 5 end '1' from sysP where id =5) aa

此查询将在表 test1 中插入测试id =5 is not there in sysP table

于 2012-05-23T11:03:52.193 回答