请问都怎么解决数据更新并发(Concurrency)的问题?

athossmth 2004-06-15 03:01:07
一般来说,对更新并发有两种策略(参考http://www.internet.com/icom_cgi/print/print.cgi?url=http://www.15seconds.com/issue/030604.htm):乐观的,或者悲观的。

    乐观的,就是直到更新的那一刻,才比较要更新的部分是否有人在上次我的读取之后有更改,这样,需要把DataSet保存起来,或者在Session中,或者在ViewState里,总之都很麻烦——如果DataSet很大呢?

    悲观的,就是在读取的时候就锁定,这又分为两种,一种是利用数据库的功能,一种是用程序。

      在http://www.15seconds.com/issue/030604.htm中,作者给出的“悲观策略”中用程序实现锁定的部分,实现它需要在数据库中定义一个“锁定数据表”,或者把想要锁定的表加上“锁定标记列”。考虑到,B/S的程序,很容易锁定完了就结束了,中途退出或者断线,这样做值得吗?出了问题,是不是还要Administrator一个一个去解锁?


我想问的是
一、对于乐观策略,如果DataSet很大呢?这方面大家有什么建议呢?谢谢。
二、对于悲观策略,程序实现锁定的部分,请问,是不是可以考虑采用Singleton的做法呢?Singleton保证了资源的独占。我不清楚的事,一旦用户断线或者非正常退出,Singleton对象是不是会像Session对象一样被自动回收(GC)呢?如果这样,岂不是就解决了“死锁”的问题,不需要超级用户去一个个解锁了?

不好意思,菜鸟,很多概念很模糊,请高手指点!



...全文
384 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
saucer 2004-06-16
  • 打赏
  • 举报
回复
//问题二:Singleton保证了资源的独占。请问:一旦用户断线或者非正常退出,Singleton对象是不是会像Session对象一样被自动回收(GC)呢?

yes, in the case of remoting, you need to override MarshalByRefObject.InitializeLifetimeService to return null to have an infinite lifetime, see

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconlifetimeleases.asp

by the way, if your singletone object has a shared resource, and needs to synchronize its access, then your singleton object could become a bottle neck and not scalable
Miracle 2004-06-16
  • 打赏
  • 举报
回复
saucer(思归/MVP)讲到点子上了,俺不多话了。
athossmth 2004-06-16
  • 打赏
  • 举报
回复
多谢各位老大,受益匪浅。
desnoc 2004-06-16
  • 打赏
  • 举报
回复
up
devfan 2004-06-16
  • 打赏
  • 举报
回复
看星星来的
MasterLRC 2004-06-16
  • 打赏
  • 举报
回复
收藏!
cnlamar 2004-06-15
  • 打赏
  • 举报
回复
端个小凳子,坐着仔细听。。。Singleton谁来详细说说?
athossmth 2004-06-15
  • 打赏
  • 举报
回复
大佬们指点,俺受益匪浅,贴子加到200分,一点小小心意。请cgsw12345等老大们继续就Singleton模式指点,或随意发言,呵呵,俺都掏着小本本记着呢……
athossmth 2004-06-15
  • 打赏
  • 举报
回复
老大们纷纷指点,在下感激不尽,请继续就Singleton模式的问题发言好吗?

问题二:Singleton保证了资源的独占。请问:一旦用户断线或者非正常退出,Singleton对象是不是会像Session对象一样被自动回收(GC)呢?

非常感谢!
cgsw12345 2004-06-15
  • 打赏
  • 举报
回复
DataSet大可以設法減小嘛!隻存儲需要判斷的數據據!
另外,我不知道樓主對Singleton的理解是否到位了(呵呵)
,當然也可能是我沒有到位!:)
cnlamar 2004-06-15
  • 打赏
  • 举报
回复
Miracle讲得蛮不错的, langmafeng说得也是~~只能尽可能的保障,似乎不可能彻底解决。。。做到最小的数据差异,说白了就是只让用户一条一条的更新~~~剩下的就丢给用户,让用户自己选择更新还是放弃吧~~
Miracle 2004-06-15
  • 打赏
  • 举报
回复
通常情况下Web应用基于乐观假设,因此请不要考虑悲观锁定策略,悲观策略会导致不可预期的结果(比如在程序重新启动前永久死锁)。

>>一、对于乐观策略,如果DataSet很大呢?这方面大家有什么建议呢?谢谢。
>>如果发现数据被更新了,怎么办?让用户放弃刚才的修改?晕死了。。。

这两个问题十分典型,我的观点是:

1,不要试图加载本次访问不会用到(被更新)的任何数据,或者尽量延迟数据加载(如分页取数据),这样可以尽量减少被缓存的数据量,也可以减少潜在的更新冲突。

2,如果数据被更新,应对策略可以很灵活,一方面可依据允许用户设定应用程序级规则,即规定
a. 在何种情况下数据总应当被最近的更新覆写,
b. 何种情况下新输入数据将被自动放弃并将最新数据重新展现给用户,同时给用户以提示信息,
c. 何种情况下放弃更新,但将用户提交的内容和数据库中现有内容返还给用户,由用户决定取消更新或进行覆写,甚至合并修改。
huangsuipeng 2004-06-15
  • 打赏
  • 举报
回复
个人感觉冲突的发生机会高的话应该用悲观锁
langmafeng 2004-06-15
  • 打赏
  • 举报
回复
B/S结构中不太可能用悲观的,代价太大;我目前在系统中采用的方式是乐观的,我在系统中所有的编辑操作都是用模式窗体打开后单条的编辑,只读取一条记录,所以DataSet不会很大,保存在Session中也就不会占用太多的资源了
cnlamar 2004-06-15
  • 打赏
  • 举报
回复
这个问题我也注意很旧了,我想我属于乐观的那种……不过还没有实际处理过这种情况~~

还想问问,如果发现数据被更新了,怎么办?让用户放弃刚才的修改?晕死了。。。
yanransoft 2004-06-15
  • 打赏
  • 举报
回复
Prevent concurrent

It is really interesting topic to discuss.
There is lot methods avilable to avoide the concurrency Errors/Bugs.

Normally,
use the TimeStamp Column - It is the Rowversion for the each record.
For Update/Delete:
1. Check the current TimeStamp and before inserted DB timestamp value.
2. If it is equal then update / delete the Record.
4. Else rollback the Changes.
5. Fetch the New Record from the Database

For Insert
Use Identity Columns to avoide the Primary Key values.
Use Triggers to find the Duplicate values
With in the Trigger if you find any Duplicate values(not only primary key) Rollback all the cahnges

There is lot of tech. is there. If you want further pls tuch with me.
yanransoft 2004-06-15
  • 打赏
  • 举报
回复
up
athossmth 2004-06-15
  • 打赏
  • 举报
回复
水势凶猛,大家帮俺顶一下啊,本题100分之外,另备有顶贴专用基金50分,决不食盐

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧