使用线程操作数据首先要考虑同步问题,照你主要说,没有办法进行同步啊
程序运行数据库操作时同步的 这里的多线程的意思指的是 每个操作都会重新 new一个数据库对象,所以导致回滚不了
@IEI: 比如A线程插入,B线程修改,如果A现在插入,B十分钟以后再修改,A还要等B吗?应该不会吧?那这时候A是插入啊还是不插入啊?
@幕三少: 不会出现这么长时间间隔 A 执行了以后 B马上执行 B出错了回滚A 就是这样啦
@幕三少: 如果希望AB线程在同一个事务下,A也需要回滚。
楼主请参考以下代码
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();
}
谢谢 DependentClone 我试试这个
@IEI: 楼主不给豆豆不地道
我想到的方案:
1. 单例, 线程共享一个数据库对象~
2. 两条线程合成一条, 先跑2, 再跑1.
疑问:
如果线程2出问题, 需要回滚线程1的操作, 但是如果线程1跑的快, 跑了两次~ 这时线程2才跑了一次, 然后出错, 那么这时你如何保证他回滚的是线程1的第一次操作呢?
反正会保证每个线程只执行一次的