使用多线程的共享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操作使用相同的事务对象,那么您只需移动基类中的事务处理逻辑,并让派生类有机会添加自己的实现,如下所示:
// 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();
}
(根据注释更新代码)