技术开发 频道

.NET中锁6大处理方法 悲观乐观自己掌握

    【IT168 专稿】本文介绍了处理.NET中锁的6种方法,首先我们讨论一下并发性问题,然后讨论处理乐观锁的3种方法,乐观锁不能从根源上解决并发问题,因此后面我们介绍了悲观锁,最后介绍隔离级别如何帮助我们实现悲观锁,每个隔离级别都列举了示例进行说明,使得概念更加清晰。

  我们为什么需要锁?

  在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这就会产生冲突,这个就是著名的并发性问题。

我们为什么需要锁?

  图 1 并行性问题漫画

  如何解决并发性问题?

  借助正确的锁定策略可以解决并发性问题,资源被锁定后,其它进程想要访问它就会被阻止。

  并发会造成什么样的冲突?

  并发主要会导致四种常见的问题,详细情况请看下表。

问题简要描述解释
脏读取当一个事务读取其它完成一半事务的记录时,就会发生脏读取
  • 用户A和用户B看到的值都是5
  •  用户B将值修改为2
  •  用户A看到的值仍然是5,这时就发生了脏读取
不可重复读取在每次读数据时,如果你获得的值都不一样,那表明你遇到了不可重复读取问题
  • 用户A看到的值是5
  • 用户B将值改为2
  • 用户A刷新后看到的值仍然是5,这时就发生了不可重复读取
虚幻行如果update和delete SQL语句未对数据造成影响,很可能遇到了虚幻行问题
  • 用户A将所有值从5修改为2
  • 用户B使用值2插入一个新记录
  • 用户A查询所有值为2的记录,但却找不到,这时就发生了虚幻行
更新丢失一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失
  • 用户A将所有值从5更新为2
  • 用户B将所有值从2更新到5
  •  用户A丢失了他的更新

  如何解决上述冲突?

  答案是使用乐观锁或悲观锁,下面将进一步进行阐述。

我们为什么需要锁?

  图 2 乐观锁和悲观锁  

0
相关文章