Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TransactionScope在连接超时时锁定表_C#_.net_Transactionscope_Sql Server 2016 - Fatal编程技术网

C# TransactionScope在连接超时时锁定表

C# TransactionScope在连接超时时锁定表,c#,.net,transactionscope,sql-server-2016,C#,.net,Transactionscope,Sql Server 2016,我们的WebAPI项目中有一个transactionscope,它执行两个操作—操作1和操作2。当操作2由于表锁而超时时,我们还有一个重试选项。在其中一个场景中,当一个用于operation2的db调用超时,并且如果第二次尝试成功,则执行的两个操作都不会提交或回滚。数据库中的表处于锁定状态。下面是代码结构 //TransactionScope in Main method TransactionScope scope= new TransactionScope() { Operation1()

我们的WebAPI项目中有一个transactionscope,它执行两个操作—操作1和操作2。当操作2由于表锁而超时时,我们还有一个重试选项。在其中一个场景中,当一个用于operation2的db调用超时,并且如果第二次尝试成功,则执行的两个操作都不会提交或回滚。数据库中的表处于锁定状态。下面是代码结构

//TransactionScope in Main method
TransactionScope scope= new TransactionScope()
{
 Operation1();
 Operation2();
 scope.commit();
}

//First operation method
public void Operation1()
{
 sqlconnection conn= new sqlConnection(connectionstring);
 try
 {
  conn.open();
  cmd = new sqlcommand(conn);
  //Executes successfully
  cmd.executenonquery();
 }
 finally
 {
  conn.close();
 }
}

//Second operation method
public void Operation2()
{
 //Assume that the first time db call in forloop failed because of timeout
 //and the second time call succeeded
 for(int I=0;i<2;i++)
  {
   sqlconnection conn= new sqlConnection(connectionstring);
   try
   {
    conn.open();
    cmd = new sqlcommand(conn);
    cmd.executenonquery();
   }
   catch(Exception e)
   {
     if(e.Message != "Connection Timeout")
     {
       Throw e;
     }
   }
   finally
   {
    conn.close();
   }
  }
}
//主方法中的TransactionScope
TransactionScope范围=新TransactionScope()
{
操作1();
操作2();
scope.commit();
}
//第一手术法
公开无效操作1()
{
sqlconnection conn=新的sqlconnection(connectionstring);
尝试
{
conn.open();
cmd=新的sqlcommand(conn);
//成功执行
cmd.executenonquery();
}
最后
{
康涅狄格州关闭();
}
}
//二次手术法
公开无效操作2()
{
//假设forloop中的第一次db调用由于超时而失败
//第二次呼叫成功

对于(int I=0;I仅使用在事务作用域之外创建的一个连接。您应该使用:
using(TransactionScope=new TransactionScope()){…}
我也在使用using语句。在正常情况下,它工作正常。但只有当一个Db调用超时并在重试后成功时,它才会失败