【问题标题】:DB concurrency - Checksum vs Timestamp数据库并发 - 校验和与时间戳
【发布时间】:2011-12-06 20:23:40
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

  • 校验和用于确定数据是否可能有效,即信用卡号或图书馆卡号。如果校验和有效,则卡号可能有效。在这种情况下,使用校验和来确定记录是否已更改并不是校验和的用途。

标签: database concurrency checksum isam


【解决方案1】:

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

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

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

【讨论】:

  • 感谢维克多。我将如何生成此版本号?它只是一个每次更新记录时递增的数字吗?
  • 是的,通常它只是一个数字。
猜你喜欢
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2020-05-16
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多