假设有3个表 A B C,C的数据根据A和B中的字段计算所得, 如何能在EF中有用户在修改A B的时候锁定相应的row,在完成之前阻止更新C的用户读取A,B。
简单来说是2个过程:
======1========
var a = A.xxx; b = B.xxx;
....
C.xxx = Fun(a, b);
=======2========
var c = C.xxx;
.....
C.xxx = ..;
如果简单使用程序同步,则相当于任何访问A,B,C的动作都被序列。影响太大,rowlock是合理的方案,但是在EF中使用rowlock的存储过程好像不起作用。求sql大神赐教
1是否可以使用sql触发器达到你的需求
2或者在表中增加一列flg 当你要锁定记录时把flg设成1 ,这样程序在读数据时忽略掉flg=1的记录
如果C表记录不是很多可以锁的方法解决,根据C表中记录的主键设置一个静态数组,再设置一个静态加锁列表,两个静态数组长度完全一致。每次修改A或B的记录前,必须先到静态数组中确定需要修改哪条C的记录,然后用LOCK方法锁住静态加锁列表中的对应记录,这样就能保证C表的每条记录同时只能有一个进程访问。注意所有对静态数组增删改查都需要加LOCK方法。