我有一个主键简单的表。大部分读取操作都是通过密钥的确切值获取一行。如何锁定数据库表或一系列行来写入?
每行中的数据与键之前和之后的行保持一些关系。所以当我插入一个新行时,我需要读取它要输入的两行,进行一些计算然后插入。
显而易见的问题是,同时另一个连接可能会在相同的时间间隔内添加一个带有键值的行。如果它与第二次插入失败的密钥值完全相同,我将予以报道,但如果密钥值不同,但在相同的时间间隔内可能会破坏关系。
解决方案似乎是在我决定添加新行或(如果可能的话,我怀疑)锁定键值的间隔时锁定整个表格进行写入。但我更喜欢那个时候只读事务不会被阻塞。
我在客户端程序和IBM DB2免费版中使用的ODBC与libodbc++ wrapper for C++(尽管数据库选择可能仍会更改)。这就是我想这样做的:
- 开始在连接自动提交和默认隔离模式
- 当需要添加一个新行,设置自动提交虚假和隔离模式连载
- 之前和新的键值后
- 计算读取行和插入新行
- 提交
- 返回到自动提交和默认隔离模式
这会做这份工作吗?是否允许其他交易同时阅读?还有其他更好的方法吗?
顺便说一句,我没有在libodbC++ i/f中看到一种指定只读事务的方式。在odbc中可能吗?
编辑:感谢非常有用的答案,我有麻烦选择一个。
什么是“真正的可串行性”? – Quassnoi 2010-11-11 22:30:54
谢谢。不幸的是,DB2不支持“LIMIT 1”。我使用'ORDER BY'并取第一行。它会锁定整个桌子吗?我想把它改成'SELECT * from mytable WHERE key =(SELECT max(key)FROM mytable where key
davka
2010-11-14 10:44:29
只修复了我的查询;忘记了ORDER BY子句。 '''SELECT max(key)FROM mytable其中键
2010-11-15 01:59:28