问个TransactionScope分布式事务的问题

harvesthouhao 2011-05-25 11:30:32
现在遇到这么个问题,我使用TransactionScope来控制数据回滚
例如:

using (TransactionScope ts = new TransactionScope())
{
//多线程操作2台数据库进行update/delete等
}

现在发现,如果是多线程操作,事务不起作用,如果改为循环操作,事务起作用。难道分布式事务不能应用到多线程上吗?
用多线程操作是为了提高性能。
...全文
234 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lisliefor 2011-05-27
  • 打赏
  • 举报
回复
以前做分布式事务,在存储过程中不控制事务,利用com+保证分布式事务。

不过每次发布的时候,需要注册com+,很老很老的一种做法了,现在微软应该有替代的技术,实现它。
harvesthouhao 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lisliefor 的回复:]
请问你有同时更新多个数据库吗?
[/Quote]

对,就是这样的方式!同时使用多线程update/delete数据库,你在这方面使用过分布式事务吗?
Lisliefor 2011-05-26
  • 打赏
  • 举报
回复
请问你有同时更新多个数据库吗?
harvesthouhao 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sp1234 的回复:]
引用 5 楼 harvesthouhao 的回复:

线程启动代码:

for (int i = 0; i < 2; i++)
{
ThreadList[i] = new Thread(new ParameterizedThreadStart(xxx));
ThreadList[i].IsBackground = true;
……

那么你的程序Paramete……
[/Quote]

这块的确不应该加join,应该使用信号量处理线程同步问题。这里用线程并也应用同步的目的是,去数据库获取数据时异步的,但汇总数据并输入是待全部线程抓取数据结束后(线程同步)才返回到前台的!


另外,希望大家继续讨论一下分布式事务下包含多线程处理数据库时的数据回滚问题应该怎么解决?
harvesthouhao 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wxr0323 的回复:]
C# code
//执行事务处理
public void DoTran()
{  //建立连接并打开
 SqlConnection myConn=GetConn();
 myConn.Open();
 SqlCommand myComm=new SqlCommand();
 //SqlTransaction myTran=new SqlTransaction();
 //注意,Sq……
[/Quote]

我所碰到的问题是,事务中包含了多线程同时操作数据库并返回数据,但事务不起作用!你这个不是多线程操作的!
harvesthouhao 2011-05-25
  • 打赏
  • 举报
回复
如果希望使用分布式事务包含多线程操作数据是否有办法呢?
丰云 2011-05-25
  • 打赏
  • 举报
回复
1>多线程操作,
最好用F#开发,
C#对多线程支持不是很好.

2>分布式事务这种东西尤其不适合多线程使用,
因为很容易出控制错误.
子夜__ 2011-05-25
  • 打赏
  • 举报
回复
//执行事务处理
public void DoTran()
{  //建立连接并打开
 SqlConnection myConn=GetConn();
 myConn.Open();
 SqlCommand myComm=new SqlCommand();
 //SqlTransaction myTran=new SqlTransaction();
 //注意,SqlTransaction类无公开的构造函数
 SqlTransaction myTran;
 //创建一个事务
 myTran=myConn.BeginTransaction();
 try
 {
  //从此开始,基于该连接的数据操作都被认为是事务的一部分
  //下面绑定连接和事务对象
  myComm.Connection=myConn;
  myComm.Transaction=myTran; //定位到pubs数据库
  myComm.CommandText="USE pubs";
  myComm.ExecuteNonQuery();//操作1
  myComm.CommandText=""; //操作2
  myComm.ExecuteNonQuery();
   //提交事务
  myTran.Commit();
 }
 catch(Exception err)
 {
myTran.rollback();
  throw new ApplicationException("事务操作出错,系统信息:"+err.Message);
  }
 finally
 {
  myConn.Close();
  }
}
harvesthouhao 2011-05-25
  • 打赏
  • 举报
回复
您的话提醒了我,ThreadList[i].Join();应该单独提出来循环。
另外new ParameterizedThreadStart(xxx)中的xxx是个一个delegate,
Start(xxx)中的xxx是个实体类,里面包含了操作数据库的相关参数


现在我的问题是,如果让分布式事务在多线程操作数据库下起作用,请您针对这个问题回答一下。谢谢
  • 打赏
  • 举报
回复
除非你重新定义ParameterizedThreadStart类型,否则你代码看起来你的xxx根本不可能去提交ts。
  • 打赏
  • 举报
回复
另外我猜你上面的代码是随便乱写的,怎么会出现“new ParameterizedThreadStart(xxx)”?除非你自己定一个一个跟.net的ParameterizedThreadStart名字完全重复的delegate。这就够乱的了。如果是随便写的,那么最好贴出自己真实的代码。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 harvesthouhao 的回复:]

线程启动代码:

for (int i = 0; i < 2; i++)
{
ThreadList[i] = new Thread(new ParameterizedThreadStart(xxx));
ThreadList[i].IsBackground = true;
……
[/Quote]
那么你的程序ParameterizedThreadStart中又是如何对ts进行提交呢?不提交,如何使得“事务其作用”?

而且,这就是多线程编程么?你倒是创建了线程,然后等待线程完毕,然后再创建了下一个线程.....我看不出这时候使用Thread有什么意义?!
harvesthouhao 2011-05-25
  • 打赏
  • 举报
回复
线程启动代码:

for (int i = 0; i < 2; i++)
{
ThreadList[i] = new Thread(new ParameterizedThreadStart(xxx));
ThreadList[i].IsBackground = true;
ThreadList[i].Start(xxx);
ThreadList[i].Join();
}
  • 打赏
  • 举报
回复
[Quote=引用楼主 harvesthouhao 的回复:]
现在遇到这么个问题,我使用TransactionScope来控制数据回滚
例如:

using (TransactionScope ts = new TransactionScope())
{
//多线程操作2台数据库进行update/delete等
}

现在发现,如果是多线程……
[/Quote]
这要看你说的“多线程”具体是个什么设计流程。

通常所说的多线程编程,只要注册线程(而不是启动线程),这个“//”所说的代码就一闪而过,直接就到了“}”这个地方了。然后CPU才会执行到所谓的“update/delete等”的代码。只有将多线程同步,让它们全都执行完之后才能执行到“}”这个地方,你的程序才不会出错。

但是此时既然又需要线程同步,那么一定是需要多线程吗?
harvesthouhao 2011-05-25
  • 打赏
  • 举报
回复
再顶,大家有没有好的解决办法呢?

using (TransactionScope ts = new TransactionScope())
{
启动两个线程同时对2个DB做UPDATE或DELETE,但分布式事务没起作用。
}

62,046

社区成员

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

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

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

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