防止并发修改 之 离线悲观锁代码示例(离线悲观锁)
背景
系统会出现并发,上篇文章我介绍了如何使用“离线乐观锁”保证并发,离线乐观锁适合处理那些重新编辑成本不大的单据,如果某个单据用户花了10分钟进行编辑,提交时你告诉他出现并发了,他心里肯定会骂娘的,今天介绍的“离线悲观锁”就可以避免这种情况。
思路
小明签出了源代码,小强就不能签出了,我们目前的源代码系统就是用的这种悲观策略。
实现
核心代码
离线悲观锁管理器接口
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Happy.Application.PessimisticLock 8 { 9 /// <summary> 10 /// 离线悲观锁管理器接口。 11 /// </summary> 12 public interface ILockManager 13 { 14 /// <summary> 15 /// 获取锁。 16 /// </summary> 17 /// <param name="entity">锁的主体,如:表名或聚合名。</param> 18 /// <param name="key">锁的主体的唯一标识,如:主键或唯一索引。</param> 19 /// <param name="owner">锁的拥有者,如:UserId或SessionId。</param> 20 /// <returns>获取锁成功就返回true,否则返回false。</returns> 21 bool AcquireLock(string entity, string key, string owner); 22 23 /// <summary> 24 /// 释放锁。 25 /// </summary> 26 /// <param name="entity">锁的主体,如:表名或聚合名。</param> 27 /// <param name="key">锁的主体的唯一标识,如:主键或唯一索引。</param> 28 /// <param name="owner">锁的拥有者,如:UserId或SessionId。</param> 29 void ReleaseLock(string entity, string key, string owner); 30 31 32 /// <summary> 33 /// 释拥有者的所有锁。 34 /// </summary> 35 /// <param name="owner">锁的拥有者,如:UserId或SessionId。</param> 36 void ReleaseLocks(string owner); 37 } 38 }
离线悲观锁代理
1 /** 2 * 离线悲观锁代理。 3 * 4 * @static 5 * @class PessimisticLockProxy 6 * @namespace Happy.server 7 */ 8 Ext.define('Happy.server.PessimisticLockProxy', { 9 alternateClassName: ['PessimisticLockProxy'], 10 singleton: true, 11 requires: ['Happy.Ajax'], 12 13 acquireLock: function (entity, key, success, failure) { 14 var me = this; 15 16 Happy.Ajax.callAction({ 17 url: '/LockManager/AcquireLock', 18 params: { entity: entity, key: key }, 19 success: success, 20 failure: failure 21 }); 22 }, 23 24 releaseLock: function (entity, key, success, failure) { 25 var me = this; 26 27 Happy.Ajax.callAction({ 28 url: '/LockManager/ReleaseLock', 29 params: { entity: entity, key: key }, 30 success: success, 31 failure: failure 32 }); 33 } 34 });
运行效果
代码下载
地址:http://happy.codeplex.com/SourceControl/latest。因为项目正在重构中,请下载最新源代码,不要下载Happy-1.0.0.3。
如何使用代码
备注
尽量通过合理的设计规避离线悲观锁,应用场景不会有很多,有使用过的朋友,请留下您宝贵的意见。