TransactionScope不能正常回滚事务问题

沙徐 2011-08-28 03:54:28
代码如下:
/// <summary>
/// 同一个连接的TransactionScope 异常不能正常回滚
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
string ConnectionString = "Server=10.72.70.101;Initial Catalog=TEST;User ID=sa;Password=test";
SqlConnection conn = new SqlConnection(ConnectionString);

conn.Open();
try
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required ))
{

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "INSERT INTO TEST(EMP_NO,SALARY) VALUES('0811010',5555)";
cmd.Connection = conn;
cmd.ExecuteNonQuery();

cmd = new SqlCommand();
cmd.CommandText = "INSERT INTO TEST(EMP_NO,SALARY) VALUES('0811010',5555)";
cmd.Connection = conn;
cmd.ExecuteNonQuery();

scope.Complete();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

如果把:conn.Open()放到 using语句块内的话,就可以正常回滚,
实现是搞不明白了,还请高人赐教!
...全文
290 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrhero 2011-08-28
  • 打赏
  • 举报
回复
这问题跟EF毫无关系...你的Connection不在TransactionScope块中,不受MSDTC事务管理,又没有创建外部事务,Required参数又指定必须有一个事务,所以当然不行...
老毕 2011-08-28
  • 打赏
  • 举报
回复
最近我也在一边学一边用EF做项目。

以往的事务,通常是利用Connection对象的BeginTransaction()方法获取显式的事务对象来开始的。而现在在EF里,由Context引入了TransactionScope。这个东西是隐式的,还可以跨线程,而不是与Connection直接相关的。

所以我自己在使用TransactionScope时,我使用的是下面这样的形式:
using (TransactionScope scope = new TransactionScope())
{
using (SqlConnection connection = new SqlConnection(connstr))
{
connection.Open();
// 事务操作
}
scope.Complete();
}

LMAOhuaNL 2011-08-28
  • 打赏
  • 举报
回复
你在你的底层方法里用using来开connection,方法执行完了就自动close掉了?你再外面加上事务会有用么?
ycproc 2011-08-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110619/12/42c4d1ce-fa77-4822-809a-e5ffff9499b5.html

希望我以前的一个帖子能帮到你

你别用看 具体的 代码

看事务的 回滚和 流程
qldsrx 2011-08-28
  • 打赏
  • 举报
回复
没用过环境事务,一般用事务最好直接用SqlTransaction类,设置SqlCommand.Transaction属性。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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