日期:2014-05-18  浏览次数:20909 次

請大家來探討:數據庫編程中並發問題
.NET后都是在本地編輯數據,再更新到數據源,可是這個並發問題如何控制?
謝謝!

------解决方案--------------------
mark
有个想法:可以在数据库建个专门的表来控制,用户取数据就把数据主键和用户ID放到这个表里面,别的用户访问之前先查下这个表看有没有用户在使用这条数据,这个可能只适用于一次更新一条数据,如果用户读取多条数据却只修改一条的话可能会有问题
------解决方案--------------------
并发可采用 update 表 set 字段1='' ,字段2=‘’ where 字段1=‘原先的字段’ and 字段2=‘原先的字段’
------解决方案--------------------
在表的构造中新建一个标志为列,tinyint,每操作一次表中的数据,相应行的标志为加1,
在操作数据的时候首先判断该标志位是否发生变化~
------解决方案--------------------
可以在表里设置一个最终更新时间字段,每一次取数据的时候,把时间保存下来的,再更新的时候拿这个时间和数据库的时间比较,如果相等说明没有人改过,如果不相等,说明被人修改过了。更新的时候把这个字段更新成NOW
------解决方案--------------------
可以采用开放式并发控制,
即当行正在更新时是不能访问的,其在行更新完成后试图更新它也将导致错误。
这个方法也叫“先来着赢”。
当然要事务和并发同时使用了
------解决方案--------------------
采用sql 自己的事务也行啊
------解决方案--------------------
2、如果楼主你的SqlDataAdapter是在界面拖进去的,你可设置UpdateCommand的CommandText属性,把比较记录是否改动的部分删掉,如下表(tblEntity,有两个字段:Entity_Id,Entity_Name,其中,Entity_Id为主键),系统生成的代码如下:
SQL code
UPDATE [tblentity] SET [Entity_Id] = @Entity_Id, [Entity_Name] = @Entity_Name WHERE (([Entity_Id] = @Original_Entity_Id) AND ((@IsNull_Entity_Name = 1 AND [Entity_Name] IS NULL) OR ([Entity_Name] = @Original_Entity_Name)));
SELECT Entity_Id, Entity_Name FROM tblEntity WHERE (Entity_Id = @Entity_Id)