当前位置:   article > 正文

什么是并发冲突以及如何在ADO.NET中处理它

什么是数据库的并发冲突

并发冲突意味着,当多个用户试图同时修改数据,一旦一个用户的修改不恰当,肯定会影响其他同时使用的用户的修改。

能够处理在这种情况下发生的事情的系统被叫做是并发控制,我们有并发控制的以下方式:

1.  悲观并发控制:一个行始终对用户是不可用的直到它从数据库中获取到更新的数据。

2.  乐观并发控制:在数据实际上被更新时,这个行才是其他用户不可用的。更新会检查数据库中的每一行,并且决定是否做出更改。尝试去更新一条数据,这条已经改变的数据导致了一个并发冲突。

3.  Last in wins”:仅在数据实际上被更新时,这个行才是其他用户不可用的。但是,它没有去跟原始数据比较;记录只是被简单的写出来,可能会重写了自上次你刷新记录以来其他用户所做的修改。

悲观并发:

悲观并发通常出于两个原因被使用。第一,在一些情况下,相同的数据处在高争用的情况。在数据上放置锁的消耗比发生并发冲突时回滚更改的消耗要少。在一个交互的过程中数据的改变是不利的时候,悲观并发在这样的情况下也很有用。一个库存应用程序就是一个很好的例子。考虑到一个公司的代表为一个潜在的客户检查库存,你通常想要锁定记录直到订单生成,这通常会用一个有序的状态来标记一个条目并且从现有的库存中消除它。如果没有订单生成,将会释放锁以便其他用户检查库存得到一个准确的可用库存的数量。

不过,在一个断开数据库连接的结构中悲观并发控制是不能实现的。数据库连接需要打开足够长的时间来读取数据或是更新数据,所以锁不能持续很长时间。此外,一个长时间锁定的应用程序是不具备可扩展性的。

乐观并发:

在乐观并发中,只有在可以访问到数据库的情况下,才可以设定和保持锁定。该锁可以避免其他用户试图在同一时间更新。数据会一直保持可用除了在更新发生时刻。有关详细信息,请参阅使用乐观并发(http://msdn.microsoft.com/enus/library/aa0416cz(VS.80).aspx

当数据尝试更新的时候,改变行的原始版本将会与数据库中已存在的行作比较。如果二者是不同的,那么更新失败并会有一个并发错误。这取决于你要用你创建的业务逻辑来使这两行保持相符。

乐观锁是如何工作的?
1、实现乐观锁的方法有多种,但基本原则都一样,总是少不了下面五个步骤:
2、记录当前的时间戳
3、开始修改值
4、在更新前,检查是否有其他人更新了值(通过检查新旧时间戳实现)
5、如果不相等就回滚,否则就提交

实现乐观锁的解决方案

在.NET中,实现乐观锁的方法主要有三种:
1、数据集(Dataset):数据集是实现乐观锁的默认方法,在更新前它会检查新旧值。
2、时间戳数据类型(timestamp):在你的表中创建一个timestamp数据类型,在更新时,检查旧时间戳是否等于新时间戳。
3、直接检查新旧值:在更新时检查旧值和新值是否相等,如果不相等就回滚,否则就提交。

Last in Wins

使用“Last in Wins”,没有对原始数据的检查并且更新是很容易被写到数据库的。据了解,以下情形可以触发它:

·         A用户从数据库中获取一条数据

·         B用户从数据库中获取相同的数据,并修改它,并将更新写回数据库

·         A用户修改“老”数据并把它写回数据库

在上述情况下,用户B做的修改不会被用户A看见。如果你打算用“Last in Wins”的并发控制的话,你要确定这种情况是可以接受的。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/84281
推荐阅读
相关标签
  

闽ICP备14008679号