使用多线程的共享SQL事务提示

本文关键字:SQL 事务 提示 共享 多线程 | 更新日期: 2023-09-27 18:20:10

我希望不同的调用共享同一SQL事务。最初的想法是保留一个指向活动事务的静态指针,但这不是线程保存,因为我正在编写WCF服务,所以我应该考虑这样的事情。我想要的不是"静态的",而是对当前上下文来说是静态的。

// The main idea
public override void SaveItem()
{
    using (var transaction = BeginSharedTransaction())
    {
        other1.Save();
        base.SaveItem();
        other2.Save();
        transaction.Commit();
    }
}
// In the base class
public void Save() { ... SaveItem(); ... }
protected virtual void SaveItem() { ... }
// In the base class (or another helper class)
static SqlTransaction _sqlTran = null;
public static SqlTransaction BeginSharedTransaction()
{
    _sqlTran = ... // conn.BeginTransaction();
    return _sqlTran;
}

如果可能的话,我更喜欢不涉及TransactionScope的解决方案。

EDIT-我想我们都同意static SqlTransaction在服务中是不好的,但这是非线程环境的最初想法。

使用多线程的共享SQL事务提示

如果您所说的"共享"是指对基类和派生类中的SQL操作使用相同的事务对象,那么您只需移动基类中的事务处理逻辑,并让派生类有机会添加自己的实现,如下所示:

// In the base class
protected SqlTransaction Transaction;
public void Save() 
{ 
    ... 
    using (var transaction = BeginSharedTransaction())
    {
        Save(Transaction);
        transaction.Commit();
    }
    ... 
}
public void Save(SqlTransaction transaction) 
{ 
    Transaction = transaction;
    SaveItem();
}
protected virtual void SaveItem() { ... /* uses Transaction on all SQL commands */ ... }
// in the derived class
public override void SaveItem()
{
    other1.Save(Transaction);
    base.SaveItem();
    other2.Save(Transaction);
}

// In the base class (or another helper class)
public static SqlTransaction BeginSharedTransaction()
{
    return ... // conn.BeginTransaction();
}

(根据注释更新代码)