locked
FAQs:什么是并发冲突以及如何在ADO.NET中处理它? RRS feed

  • 问题

  • 为了帮助大家更好地学习 ADO.NET DataSet 技术,微软论坛技术支持团队编辑了一些列的 ADO.NET DataSet 常见问题及解答" 精华帖。

    本帖的主题是:什么是并发冲突以及如何在ADO.NET中处理它?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "ADO.NET DataSet 常见问题及解答",请打开索引页面:

    http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/thread/f968dfe5-f9e3-4ed0-9c7f-cf26837ea828


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月25日 10:16

答案

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

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

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

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

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

    悲观并发:

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

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

    乐观并发:

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

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

    Last in Wins

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

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

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

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

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

    相关资源:

    http://msdn.microsoft.com/en-us/library/cs6hb8k4(VS.80).aspx

    http://msdn.microsoft.com/en-us/magazine/cc163924.aspx

    相关帖子:

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/60466d72-5691-4f4b-b427-961c58d60a6d

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/3e431a0c-6a06-411e-8c8e-fd13a911b2c4

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/301530d2-64f5-4d0e-b6dd-4339b8e26354
    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月25日 10:17