【问题标题】:optimistic lock or pessimistic lock?乐观锁还是悲观锁?
【发布时间】:2014-09-24 07:15:56
【问题描述】:

在我的应用程序中,每当我更新数据库中的记录时,我都会使用如下查询: udapte set ... from mytable where status='normal';

mytable 中有一个名为 status 的字段,如果插入/删除记录,它将以 normal/cancel 作为值。

现在,当我同时对 mytable 进行查询时,它工作正常,正在处理并发(三个人远程访问)。但现在我想知道它是哪种类型的锁? 乐观或悲观,或两者都不是。

通过http://en.wikipedia.org/wiki/Optimistic_concurrency_control 增加了我已经有的疑虑,因为我没有注册时间戳!

【问题讨论】:

  • 什么关系型数据库? .______
  • @usr RDBMS 是 oracle

标签: database locking


【解决方案1】:

在您的场景中没有处理并发。 User1 可以覆盖 User2 的数据,而不会看到或知道 User2 的更新。

乐观锁定是在记录中使用RowVersion 之类的构造。发生的情况是 User1 获取记录和 RowVersion,然后 User2 在第二秒后获取记录。用户 1 更新记录,RowVersion 递增为 2。用户 2 尝试更新记录但不能因为他/她的 RowVersion 旧。

用户1

 UPDATE record
    SET status = 'test', RowVersion = 2
    WHERE RowVersion = 1;

用户2

 UPDATE record
    SET status = 'test2', RowVersion = 2
    WHERE RowVersion = 1;

由于 RowVersion 更改为 2,此语句导致零条记录受到影响。

【讨论】:

  • 你不认为我们使用status=normal 可以达到同样的效果吗,它有点类似于使用rowversion(至少按照概念)。你的意见是什么?
猜你喜欢
  • 2013-09-16
  • 1970-01-01
  • 2010-09-12
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2012-01-31
  • 2014-08-30
相关资源
最近更新 更多