我正在为每个请求使用一个TransactionScope,如下所示:
public ActionResult Login(string user, string pass)
{
using (ServerContext context = new ServerContext ())
{
TransactionOptions transOptions = new TransactionOptions();
transOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
transOptions.Timeout = TransactionManager.MaximumTimeout;
using (var scope = new TransactionScope(TransactionScopeOption.Required, transOptions))
{
// Some logic and Linq queries here
}
}
我在事务范围内执行一些插入,更新,删除和proc调用 但是,我得到了一些罕见的DeadLock表示高负载。那么,我做得对吗? 或者最好每次操作打开一个TransactionScope? (但是如果其中一个集合失败,我需要回滚所有操作。)
揍你。
答案 0 :(得分:0)
AFAIK,在L2S中调用SubmitChanges时,LINQ to SQL会检查调用是否在Transaction的范围内,或者是否将Transaction属性(IDbTransaction)设置为用户启动的本地事务。如果它找不到任何事务,LINQ to SQL将启动本地事务(IDbTransaction)并使用它来执行生成的SQL命令。成功完成所有SQL命令后,LINQ to SQL将提交本地事务并返回。
我对MVC / EF没有任何想法,但尝试这样包装:
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (ServerContext context = new ServerContext ())
{
// Some logic and Linq queries here
}
scope.Complete();
}