我有这些表格:
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)
}
我知道我可以锁定所有桌子,但还有其他方法吗?
答案 0 :(得分:1)
您无法在应用程序层中解决此问题。您可以在数据库层中解决它。作为一般规则,您希望数据库强制执行数据完整性规则,正是您注意到的原因 - 多个线程可能同时尝试不兼容的操作。数据库符合ACID(或者至少可以使用正确的参数设置),允许隔离不同的事务。
因此,您的问题的解决方案是一对唯一约束/索引:co_key(keyname)
和co_keyvalue(co_keyid, value)
。完成这些操作后,您需要检查代码中由不正确数据生成的错误。