并发键值表

时间:2015-01-17 11:14:13

标签: sql database

我有这些表格:

CO_KEYVALUE

co_keyvalueid int
co_keyid int
value text

CO_KEY

co_keyid int
keyname varchar(128)

问题是:如何有效地控制字段键名在应用层中是唯一的?

例如:

客户端1 插入("名称","客户端1")

同时,客户端2插入("名称","客户端1")

Function Put(Name, Value) {
    Id = SELECT co_keyid FROM co_key WHERE co_keyname = :Name

    If(!Id) {
       // Autoincrement
       Id = INSERT INTO co_key (NULL, :Name)
    }

    INSERT INTO co_keyvalue (NULL, :id, :Value)
}

我知道我可以锁定所有桌子,但还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

您无法在应用程序层中解决此问题。您可以在数据库层中解决它。作为一般规则,您希望数据库强制执行数据完整性规则,正是您注意到的原因 - 多个线程可能同时尝试不兼容的操作。数据库符合ACID(或者至少可以使用正确的参数设置),允许隔离不同的事务。

因此,您的问题的解决方案是一对唯一约束/索引:co_key(keyname)co_keyvalue(co_keyid, value)。完成这些操作后,您需要检查代码中由不正确数据生成的错误。