c# - .Net Core 2.1中的主事务发生错误时如何回滚子事务
问题描述
我在我的项目(.Net Core 2.1)中使用了两个不同的数据库。如果主事务中发生错误,我无法回滚子事务。
以下是步骤:
- 使用 DB1 的事务打开新连接
- 对 DB1 的患者表执行更新操作(成功)
- 使用 DB2 事务打开新连接
- 对 DB2 的患者表执行更新操作(成功)
- 为 DB2 提交事务并关闭连接
- 对 DB1 的患者表执行更新操作(发生错误)
- DB1 的回滚事务
- 如何回滚 DB2 事务?
下面是我的代码片段。
public class CheckTransations
{
public void CheckTran()
{
string strConnString1 = @"data source = 177.16.8.68\sqlexpress; initial catalog = DB1; persist security info = True; user id = sa; password = 99$indd; MultipleActiveResultSets = True; ";
string strConnString2 = @"data source = 177.16.8.68\sqlexpress; initial catalog = DB2; persist security info = True; user id = sa; password = 99$indd; MultipleActiveResultSets = True; ";
SqlTransaction objTrans1 = null;
SqlTransaction objTrans2 = null;
using (SqlConnection objConn1 = new SqlConnection(strConnString1))
{
objConn1.Open();
objTrans1 = objConn1.BeginTransaction();
SqlCommand objCmd1 = new SqlCommand("update Patient set chartNumber = 'C5' where PatientId = 5", objConn1, objTrans1);
try
{
var PatientId = objCmd1.ExecuteNonQuery();
using (SqlConnection objConn2 = new SqlConnection(strConnString2))
{
objConn2.Open();
try
{
objTrans2 = objConn2.BeginTransaction();
SqlCommand objCmd2 = new SqlCommand("update Patient set ChartNumber = 'C029' where PatientId = 29", objConn2, objTrans2);
var PatientId2 = objCmd2.ExecuteNonQuery();
objTrans2.Commit();
}
catch (Exception ex)
{
objTrans2.Rollback();
throw;
}
finally
{
objConn2.Close();
}
}
objCmd1 = new SqlCommand("update Patient set chartNumber = 'C5' where PatietId = 1036", objConn1, objTrans1);
var PatientId1 = objCmd1.ExecuteNonQuery();
objTrans1.Commit();
}
catch (Exception ex)
{
objTrans1.Rollback();
}
finally
{
objConn1.Close();
}
}
}
}
解决方案
推荐阅读
- tensorflow - 如何在使用 conda 安装 tensorflow 时修复“没有空间留给此设备”错误?
- vue.js - 如何初始化生成的标记?
- google-apps-script - 谷歌应用脚本,如何在另一个具有 ID 的文件中创建触发器?
- c++ - 查找其数字平方和为素数的数(Pascal 或 C++)
- c++builder - 为什么 #pragma 消息在 hpp 文件中不起作用?
- javascript - 无法创建堆积条形图?
- python - 如何使用 webscraping 来抓取 Inspect elemrnt 中的数据或查看页面源
- c# - 是否可以检索委托函数数据库并执行它?
- sql - 如何列出sybase模式中的所有表?
- mysql - 如何修复mysql访问被拒绝?适用于家庭服务器但不适用于生产服务器