关于开放式并发的一个奇怪的问题
最近在写一个基于web service的应用程序,碰到了一个奇怪的问题。
功能比较简单,定义了一个EducationData类,它直接与数据库进行交互,完成数据的读写、更新等操作,一个web service类EducationService,它只是简单的调用EducationData类中相应的方法,向用户公开公开了
GetEducationData、UpdateExam等方法。
在客户端调用web service没有问题,数据读取,更新一切都正常,但在有数据并发冲突的时候出现了问题。
EducationData类中,UpdateExam实现大致是这样的:并发采用的策略是与数据库中的原始值比较,若在更新时有冲突发生(更新出现错误,在数据库中找到该条数据,一同反馈给用户,我做了一个弹出窗口,包括原始数据和当前数据,供用户选择如何处理),主要代码如下:
private SqlDataAdapter daExam;
private SqlDataAdapter daConflict;
private DataSet dsConflict;
daExam.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);
public DataSet UpdateExam(DataSet dsExam)
{
try
{
daExam.Update(dsExam, "Exam ");
dsExam.Merge(dsConflict, true);
}
catch (DBConcurrencyException dbEx)
{
EventLogHelper.LogError(dbEx.Message);
}
return dsExam;
}
private void OnRowUpdated(object sender, SqlRowUpdatedEventArgs e)
{
if ((e.Status == UpdateStatus.ErrorsOccurred) && (e.Errors.GetType() == typeof(DBConcurrencyException)))
{
daConflict.SelectCommand.Parameters[0].Value = e.Row[ "ID "];
int count = daConflict.Fill(dsConflict, "Exam ");
if (count == 1)
{
&