事务的试验

来源:互联网 发布:找错别字的软件 编辑:程序博客网 时间:2024/05/04 07:43

  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一样,一定要等待它
提交,才能自己继续。

原创粉丝点击