数据库级或用户级锁

时间:2016-01-15 11:03:30

标签: database multithreading nhibernate concurrency locking

我目前面临以下问题:
我有一个C#.NET应用程序连接到数据库(使用NHibernate)。应用程序基本上显示数据库内容并允许用户编辑它。由于应用程序的多个实例同时运行(在相同和不同的工作站上),一旦两个用户同时修改同一记录,我就会出现并发问题。

目前我解决了乐观锁定的问题。但这并不是一个完美的解决方案,因为一个用户仍然无法改变它。

现在我想到了让应用程序每次从数据库加载新条目时锁定一个条目,并在用户切换到另一条目时立即释放锁定。因此,基本上当前显示给用户的所有条目都被锁定在数据库中。如果另一个用户加载锁定的条目,它将以只读模式显示它们。

现在我的实际问题:
在数据库级别上进行锁定是个好主意吗?这意味着每次用户加载新条目并锁定它时,我都会打开一个新事务。或者通过" Lock Table"更好地做到这一点?例如,它包含表中所有锁定条目的键?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

在数据库级别上进行锁定是个好主意吗?

是的,在某些情况下很好。

  

所以基本上所有当前显示给用户的条目都是   锁定在数据库中。
  ...
  或者通过“锁定表”来实现它会更好吗?“锁定表”例如保存表中所有锁定条目的键?

所以你在页面加载时锁定了一堆条目?你何时会释放它们?如果编辑将花费大量时间(例如,已经开始编辑条目然后去吃午餐)怎么办?如果用户关闭页面而不编辑所有这些锁定的条目,条目将保持锁定多长时间怎么办? 悲观锁定和“锁定表”有助于避免乐观锁定的一些问题,但带来新的。

  

目前我解决了乐观锁定的问题。但这并不是一个完美的解决方案,因为一个用户仍然无法改变它。

不能同意这是松动的,因为在你的情况下,如果验证和提交阶段作为单个原子操作执行,那么输入不会被破坏,只有一个事务会成功(假设它是第一个) ,另一个将被回滚(第二个) 根据{{​​3}}

  

如果只有这些数据库事务中的一个(最后一个),它将是原子的   一)存储更新的数据,所有其他数据只是读取数据。

     

唯一与高并发性和高并发性的方法   可伸缩性是带版本控制的乐观并发控制。   NHibernate提供了三种可能的编写方法   使用乐观并发的应用程序代码。

因此第二个交易将被优雅地回滚,之后可以通知用户他要么进行新的编辑(新交易),要么跳过此条目。

但一切都取决于您的业务逻辑和要求。如果您没有对数据进行高争用,因此不会发生大量冲突,那么我建议您使用乐观锁定。