C#, EntityFramework, LINQ 跨資料庫進行Transaction控制
利用 dbContext.Database.BeginTransaction() 來控制
範例程式
- string ora_con_str = ConfigurationManager.ConnectionStrings["ora_cnn_str"].ToString();
- string ms_con_str = ConfigurationManager.ConnectionStrings["ms_cnn_str"].ToString();
- SqlConnection msDbConn = new SqlConnection(ms_con_str);
- OracleConnection oraDbConn = new OracleConnection(ora_con_str);
- msDbConn.Open();
- oraDbConn.Open();
- using (DbContext dbContextTT = new DbContext(oraDbConn, false))
- using (DbContext dbContextMS = new DbContext(msDbConn, false))
- {
- using (var transactionTT = dbContextTT.Database.BeginTransaction())
- using (var transactionMS = dbContextMS.Database.BeginTransaction())
- {
- try
- {
- sql = @"
- insert into TEST_ALEX(A,C) select '111', 33 from dual
- ";
- rec = dbContextTT.Database.ExecuteSqlCommand(sql);
- sql = @"
- insert into A (A1, A2, A3) select 'A11','22','33'
- ";
- rec = dbContextMS.Database.ExecuteSqlCommand(sql);
- transactionTT.Commit();
- transactionMS.Commit();
- }
- catch (Exception exp)
- {
- //不需要下Rollback, 後續離開[using transaction]的區塊, 會自動Rollback
- //MSSQL不知為何在執行失敗後, 會導致[transactionMS的connection變成null],無法執行Rollback, 但[transactionTT]卻不會發生connection為null情況, 可以正常執行Rollback
- //transactionMS.Rollback();
- //transactionTT.Rollback();
- throw exp;
- }
- }
- }
利用TransactionScope (資料庫需開啟[MSDTC, 分散式交易])
- using (TransactionScope scope = new TransactionScope())
- {
- using (var dbContext1 = new MyDbContext1()) // 第一个数据库上的 DbContext
- using (var dbContext2 = new MyDbContext2()) // 第二个数据库上的 DbContext
- {
- try
- {
- // 在 dbContext1 上执行操作
- var entity1 = new MyEntity1 { Name = "Entity 1" };
- dbContext1.MyEntities1.Add(entity1);
- dbContext1.SaveChanges();
- // 在 dbContext2 上执行操作
- var entity2 = new MyEntity2 { Name = "Entity 2" };
- dbContext2.MyEntities2.Add(entity2);
- dbContext2.SaveChanges();
- // 提交分布式事务
- scope.Complete();
- }
- catch (Exception ex)
- {
- // 处理异常
- Console.WriteLine($"发生异常: {ex.Message}");
- }
- }
- }
留言
張貼留言