我有一个带有主键的简单表。大多数读取操作通过键的确切值获取一行。
每一行中的数据在键顺序中与它之前和之后的行保持某种关系。所以当我插入一个新行时,我需要读取它要进入的 2 行,进行一些计算然后插入。
显然,问题在于,同时另一个连接可能会在同一时间间隔内添加具有键值的行。如果它与第二次插入失败的键值完全相同,我会被覆盖,但如果键值不同但在相同的时间间隔内,则关系可能会被破坏。
解决方案似乎是在我决定添加新行时锁定整个表以进行写入,或者(如果可能的话,我怀疑)锁定键值的间隔。然而,我更希望那时只读事务不会被阻止。
我在客户端程序和 IBM DB2 免费版中使用带有libodbc++ 包装器的ODBC(尽管 DB 选择可能仍会改变)。这就是我想做的事情:
- 以自动提交和默认隔离模式启动连接
- 当需要添加新行时,将 auto-commit 设置为 false 并将隔离模式设置为 serialized
- 读取新键值前后的行
- 计算并插入新行
- 犯罪
- 返回到自动提交和默认隔离模式
这会做这项工作吗?是否允许其他事务同时读取?还有其他/更好的方法吗?
顺便说一句,我没有在 libodbc++ i/fa 中看到指定只读事务的方式。在odbc中可以吗?
编辑:感谢非常有用的答案,我很难选择一个。