事务的试验
来源:互联网 发布:找错别字的软件 编辑:程序博客网 时间: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一样,一定要等待它
提交,才能自己继续。
- 事务的试验
- 事务对数据块的操作过程的分析和试验
- spring事务属性的几个试验(转载)
- 关于试验的思考
- 一个HttpClient的试验
- 小丁的试验
- 小丁的试验
- BGP的MED试验
- 试验的代码1
- Subversion的试验分支
- 试验FtpWebRequest的断点续传
- 试验数据的保存
- linux container_of的试验
- 【试验设计的问答】
- 试验
- 试验
- 试验
- 试验
- C++文章摘选
- C&C++程序错误调试大全
- lib和dll文件的区别和联系
- mysql 游标
- 定时器操作
- 事务的试验
- 转载:C# String.Format
- Meta标签详解
- 与邮件系统相关的国际标准协议
- JAVA WEB程序中添加定时器
- sql2005表结构
- 回溯法简单实例
- 重定向输出
- jax-ws(Java API for XML Web Services)实践教程