redo:
try
{
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(...))
{
conn.Open();
DataSet dataSetShangPinKuCun = new DataSet();
string select = @"SELECT * FROM ERP_DANJUSUFFIX WHERE STYLE='TEST'";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(select, conn);
SqlCommandBuilder builder = new SqlCommandBuilder(sqlDataAdapter);
sqlDataAdapter.Fill(dataSetShangPinKuCun);
Thread.Sleep(1000)
DataRow newRow = dataSetShangPinKuCun.Tables[0].Rows[0];
newRow["SUFFIX"] = int.Parse(newRow["SUFFIX"].ToString().Trim()) - 1;
sqlDataAdapter.Update(dataSetShangPinKuCun);
conn.Close();
}
ts.Complete();
}
}
catch(SqlException ex)
{
if (ex.Number == 1205)
goto redo;
}
假设这段代码在两个进程里同时执行
1)都有:using (TransactionScope ts = new TransactionScope())
进程A将成功,进程B将失败,触发1205错误。
进程A和进程B互锁,都在等待提交对ERP_DANJUSUFFIX的访问(无论是读或写)
2)都没有:using (TransactionScope ts = new TransactionScope())
进程A将成功,进程B将失败,进程B尝试执行。
newRow["SUFFIX"] = int.Parse(newRow["SUFFIX"].ToString().Trim()) - 1;
newRow["SUFFIX"] 已经不是原来的值了。
3)进程A有:using (TransactionScope ts = new TransactionScope())
进程B无
假设A先执行,
A成功,进程B将等待A事务提交,但出现了和2)一样的错误
假设B先执行
B将成功,A出现了和1)一样的错误;但B也可能失败,出现和1)一样册错误。
4)假设进程B只是读操作,进程A不会象1)中对待在事务中的进程B一样,一定要等待它
提交,才能自己继续。
本文探讨了在使用TransactionScope进行数据库操作时不同进程间的事务冲突问题,并分析了四种不同的场景下可能产生的错误及其原因。
1375

被折叠的 条评论
为什么被折叠?



