TransactionScope没有自动回滚?

diffmaker 2013-03-14 05:37:49
按书上的说法,使用TransactionScope创建事务代码块(在数据库表中插入两条记录),运行后显示
违反了 PRIMARY KEY 约束 'PK_Employee'。不能在对象 'dbo.Employee' 中插入重复键。 语句已终止。
这个是预期的,但查数据表后,发现第一条insert语句成功插入了,没有回滚?

代码如下,烦劳指导一下:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
using (TransactionScope trans = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["DotNetDb"].ConnectionString))
{
try
{
conn.Open();
SqlCommand cmd;
cmd = new SqlCommand("insert into employee values(8,'A','设计部','北京','a@126.com')", conn);
cmd.ExecuteNonQuery();
cmd = new SqlCommand("insert into employee values(8,'B','程序部','上海','b@sohu.com')", conn);
cmd.ExecuteNonQuery();
this.Label1.Text = "OK!";
}
catch(Exception ex)
{
this.Label1.Text = ex.Message;
}
}
trans.Complete();
}
}
}
...全文
569 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang583782308 2015-07-14
  • 打赏
  • 举报
回复
try { using (TransactionScope scope = new TransactionScope()) { response.IsError = Constant.YesNo.No; response = Provide<SmartBoxBC>.Init.InsertBoxUse(request); if (response.IsError == Constant.YesNo.No) { scope.Complete(); } } } catch (Exception ex) { ExceptionHandling(ex); response.IsError = Constant.YesNo.Yes; response.ErrorCode = Constant.ErrorCode.Exception; } 自定义错误,如果后面的处理逻辑出错,就不要提交该事务。数据库中就不会有数据了!
wangwenjunyanda 2013-09-03
  • 打赏
  • 举报
回复
我最近也要用到这个类啊,我也是出现同样的问题,就是出现异常后,都没有回滚的,数据照样写到数据库里了。好郁闷啊,这个到底怎么用的啊 求高手帮帮忙啊!!
diffmaker 2013-03-14
  • 打赏
  • 举报
回复
引用 2 楼 hustcyb 的回复:
问题的症结在这里 C# code?1trans.Complete(); Complete会交将事务提交(commit),所以出错前的SQL当前就执行了,将你的代码改成下面这样就行了 C# code?12345678910111213141516171819202122232425262728protected void Page_Load(object sender……
谢谢,需要将Complete()包含在try块中
种草德鲁伊 2013-03-14
  • 打赏
  • 举报
回复
在dispose之前不调用complete就会回滚了...
diffmaker 2013-03-14
  • 打赏
  • 举报
回复
引用 1 楼 zx75991 的回复:
你的代码没有事务回滚操作。 在catch里面加上 trans.Rollback()
谢谢回复,TransactionScope没有Rollback方法
hustcyb 2013-03-14
  • 打赏
  • 举报
回复
问题的症结在这里

trans.Complete();
Complete会交将事务提交(commit),所以出错前的SQL当前就执行了,将你的代码改成下面这样就行了

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        try
        {
            using (TransactionScope trans = new TransactionScope())
            {
                using (SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["DotNetDb"].ConnectionString))
                {
                    conn.Open();
                    SqlCommand cmd;
                    cmd = new SqlCommand("insert into employee values(8,'A','设计部','北京','a@126.com')", conn);
                    cmd.ExecuteNonQuery();
                    cmd = new SqlCommand("insert into employee values(8,'B','程序部','上海','b@sohu.com')", conn);
                    cmd.ExecuteNonQuery();
                      this.Label1.Text = "OK!";
                }
                
                trans.Complete();
            }
        }
        catch(Exception ex)
        {
            this.Label1.Text = ex.Message;
        }
    }
}
天下在我心 2013-03-14
  • 打赏
  • 举报
回复
你的代码没有事务回滚操作。 在catch里面加上 trans.Rollback()

62,046

社区成员

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

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

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

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