C# TransactionScope在连接超时时锁定表
我们的WebAPI项目中有一个transactionscope,它执行两个操作—操作1和操作2。当操作2由于表锁而超时时,我们还有一个重试选项。在其中一个场景中,当一个用于operation2的db调用超时,并且如果第二次尝试成功,则执行的两个操作都不会提交或回滚。数据库中的表处于锁定状态。下面是代码结构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()
//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调用超时并在重试后成功时,它才会失败