首页 新闻 会员 周边 捐助

.net 多线程入库 事务

0
悬赏园豆:100 [已关闭问题] 关闭于 2014-03-17 16:52

 请教个问题 。。
.net 多线程入库 事务 操作 怎么实现?
大概怎么做  知道的朋友 能大概说下么

线程1:insert或update操作

线程2:insert或update操作

线程2如果出错 需要回滚 线程1的操作,应该怎么做,一般的事务处理好像不行,请教~!

问题补充:

不行的原因好像就是每个操作都创建一个数据库对象导致的,现在不能修改这样的创建方式(会导致别的问题),请问怎么才能在多线程操作数据库的情况下回滚

IEI的主页 IEI | 初学一级 | 园豆:63
提问于:2014-03-15 14:19
< >
分享
所有回答(3)
0

使用线程操作数据首先要考虑同步问题,照你主要说,没有办法进行同步啊

幕三少 | 园豆:1384 (小虾三级) | 2014-03-15 15:10

程序运行数据库操作时同步的    这里的多线程的意思指的是   每个操作都会重新 new一个数据库对象,所以导致回滚不了

支持(0) 反对(0) IEI | 园豆:63 (初学一级) | 2014-03-15 15:40

@IEI: 比如A线程插入,B线程修改,如果A现在插入,B十分钟以后再修改,A还要等B吗?应该不会吧?那这时候A是插入啊还是不插入啊?

支持(0) 反对(0) 幕三少 | 园豆:1384 (小虾三级) | 2014-03-15 15:50

@幕三少: 不会出现这么长时间间隔 A 执行了以后 B马上执行   B出错了回滚A 就是这样啦

支持(0) 反对(0) IEI | 园豆:63 (初学一级) | 2014-03-15 17:11

@幕三少: 如果希望AB线程在同一个事务下,A也需要回滚。

支持(0) 反对(0) IEI | 园豆:63 (初学一级) | 2014-03-15 17:14
0

楼主请参考以下代码

using(System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope())
{
for(int i = 0;i<taskcount;i++)
{
var dtx = System.Transactions.Transaction.Current.DependentClone(System.Transactions.DependentCloneOption.BlockCommitUntilComplete);
Task t = new Task(()=>{
try
{
using(var ntran = new System.Transactions.TransactionScope(dtx))
{
for(int j =0; j<50;j++)
{
this.TestUpdate();
}
ntran.Complete();
}
}
finally
{
dtx.Complete();
dtx.Dispose();
}
});
tasks[i] = t;
t.Start();
}

Task.WaitAll(tasks);

this.TestUpdate();

ts.Complete();
}

白菜园 | 园豆:409 (菜鸟二级) | 2014-03-15 16:55

谢谢   DependentClone  我试试这个

支持(0) 反对(0) IEI | 园豆:63 (初学一级) | 2014-03-15 17:16

@IEI: 楼主不给豆豆不地道

支持(0) 反对(0) 白菜园 | 园豆:409 (菜鸟二级) | 2014-03-18 12:24
0

我想到的方案:

1. 单例, 线程共享一个数据库对象~

2. 两条线程合成一条, 先跑2, 再跑1.

疑问:

如果线程2出问题, 需要回滚线程1的操作, 但是如果线程1跑的快, 跑了两次~ 这时线程2才跑了一次, 然后出错, 那么这时你如何保证他回滚的是线程1的第一次操作呢? 

eatpockyboy | 园豆:260 (菜鸟二级) | 2014-03-16 09:12

反正会保证每个线程只执行一次的

支持(0) 反对(0) IEI | 园豆:63 (初学一级) | 2014-03-17 09:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册