数据库并发 - 校验和与时间戳

时间:2011-12-06 20:23:41

标签: database concurrency checksum isam

我们正在迁移到新的数据库系统。该数据库属于ISAM类型,并且API不提供检测其他用户是否更改了记录的方法。

因此,我需要在客户端实现此功能。我目前正在使用前后记录缓冲区计算校验和并比较结果。

我的问题是,既然有可能为两个不同的记录计算相同的校验和值,那么改为使用时间戳字段会更好吗?

如何正常处理记录更改检测?

谢谢。

1 个答案:

答案 0 :(得分:0)

最好不是时间戳,这是不可靠的,而是一个整数字段版本,您的客户端代码可以使用它来检测数据库中的并发更改。

这称为"乐观锁定",当您的交易没有锁定任何数据库资源时,直到更新数据库为止。此时它锁定所需的DB资源(例如,表),从DB读取版本并检查它是否具有预期值。如果是,这意味着可以安全地更新数据库以及DB中的版本号。如果不是,这意味着有并发更新和事务需要中止。

当然,如果你有很多中止,这意味着你需要"悲观锁定",你的应用锁定整个交易的任何资源。如果您的数据库驱动程序不支持此操作,则您需要一些其他共享锁,例如互斥锁。在大多数情况下,这种方法会降低吞吐量,因为并发事务必须等到一个事务释放锁定的资源。