SQL Server并发编程:悲观锁与乐观锁策略
1. SQL Server并发特性升级
在SQL Server中,SNAPSHOT隔离级别和READ_COMMITTED_SNAPSHOT设置是并发特性的重要升级。当进行表数据读取时,第二次读取的数据可能与第一次不同,这种行为类似于普通的READ COMMITTED,但在检索单个语句产生的行时,不会出现幻读和不可重复读的问题(其他用户在扫描表时可以删除和添加行,但不会影响当前读取),且SQL Server无需加锁或阻塞其他用户。
虽然它在数据一致性方面与普通的READ COMMITTED存在相同问题,甚至可能稍差,但它能减少阻塞,降低在小报告和只读查询中使用脏读查看活动OLTP数据的需求,还能为用户界面进程缓存数据。
2. 并发编程考虑因素
在构建数据库系统时,必须考虑多个用户可能同时修改数据的情况。大多数应用程序的一般事件流程如下:
1. 为用户或进程获取数据以供查看。
2. 对数据进行操作。
3. 对数据进行更改或根据检索到的值做出决策。
4. 用户完成操作后,将更改提交到数据库,或根据决策将数据保存到其他表。
在编码时,需要考虑用户将数据缓存在客户端时的延迟时间。例如,当不同用户想要同一数据并进行更改时,可采用以下常见方案:
- 悲观锁 :假设用户很可能尝试修改相同数据,因此对重要资源进行单线程访问。
- 乐观锁 :假设用户不太可能在同一时间尝试修改同一行数据,仅在用户想要更改数据时验证缓存数据的有效性。
使用这两种方案中的一种