更新表的问题

zwq78 2006-07-05 02:13:28
通过dataadpter得到一个离线的datatable(有多条记录),可修改多条记录后再行update回数据库,

场景如下:
1、A用户打开这个表;
2、B用户打开这个表;
3、A用户删除第一条记录并保存成功(update回了数据库);
4、B用户编辑第一条记录,修改后保存,提示出错了。

问题:如果避免这种情况?
解决一:是让A用户独占这个表,其它用户只能以只读方式打开(如何实现???)
解决二:修改程序逻辑,让用户修改一条记录后必须保存(但还是不能解决全部问题)
解决三:??????
...全文
258 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
阿牛138588 2006-07-06
这内容好像以前读书的时候老师讲过,处理办法就是lock row。A用户修改记录时锁定记录,B用户若同时修改就会被拒绝,当记录解除锁定后,再进行修改。虽然实际上很少碰到这样的问题,但出现了可不是闹着玩的。
  • 打赏
  • 举报
回复
3tzjq 2006-07-06
这的确是个很大的问题!
此问题同样涉及基础,关联数据表的问题.如:
基础表:Employee
A用户对其删除/修改了ID为"12345"的员工资料;
B用户正在录入所有员工工资(包括"12345");
B用户更新时也会遇到此问题!
-----
我的解决方法:
添加一个程序数据安全设置:
http://img478.photo.163.com/sezjq/13984622/1550786249.jpg

添加事件处理:
AddHandler Me.GetDataAdapter.RowUpdated, AddressOf RowUpdated

Private Sub RowUpdated(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs)
Me.OnRowUpdated(e)

End Sub

Protected Overridable Sub OnRowUpdated(ByVal e As System.Data.SqlClient.SqlRowUpdatedEventArgs)
If e.Status = UpdateStatus.ErrorsOccurred Then'更新时出错
'....在此进行错误数据行处理和收集

End If

If Me.RowUpdateStatus <> UpdateStatus.ErrorsOccurred Then e.Status= = Me.RowUpdateStatus'设置更新错误动作
End If
End Sub

此举最主要的目的是:即使有数据行更新失败,依然能够允许用户可选择的继续更新其它数据行.

编写一个SmartBuildErrorReport类,此类实现对当前更新失败的行进行分析并提供解决方案:
允许用户重新写入此行(已被其它用户删除);
新增或修改此基础数据(引用的基础数据已经不存在);
备份失败数据记录(备份后,对相应数据进行修复后再导入,再更新);
取消/删除此数据行;
....

这样以后,基本以可解决所有不可预知的数据事务!
  • 打赏
  • 举报
回复
kssys 2006-07-05
数据库中新建一个表,记录当前所有用户的状态。修改或保存时做提示
  • 打赏
  • 举报
回复
zwq78 2006-07-05
三位的解决方法都有可行性,但是就是要引入些新的东西,比较麻烦。
有没有更简单的。
  • 打赏
  • 举报
回复
zwq78 2006-07-05
谢谢楼上三位,其实这个问题并不仅仅局限于删除,A用户修改了多条数据后,B用户的数据不能得到及时更新,因此,B用户实际是在对旧数据进行更改,而且,可能还会覆盖A用户的修改。

难道数据库中没有对这类问题的统一解决方法吗?
  • 打赏
  • 举报
回复
kssys 2006-07-05
解决四:加个列LastChangedTime,更新时对照服务器的LastChangedTime是否与本地的LastChangedTime相同,做相应提示
  • 打赏
  • 举报
回复
Knight94 2006-07-05
无法完全避免这种操作,毕竟数据都是离线的,
你所说的问题属于数据库操作同步问题。
你可以在更新操作的时候,先判断记录是否存在,这可以用存储来完成,从而保证操作的原子性。
  • 打赏
  • 举报
回复
copall 2006-07-05
解决1:若这个表有时间戳字段的话~每次更新时都进行一下时间戳比较即可

解决2:更新记录时,先判断记录存在
Select * from TableA(with nolock) where PK_id=xx
  • 打赏
  • 举报
回复
相关推荐
发帖
VB
加入

1.6w+

社区成员

VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
申请成为版主
帖子事件
创建了帖子
2006-07-05 02:13
社区公告
暂无公告