C#, EntityFramework, LINQ 跨資料庫進行Transaction控制

利用 dbContext.Database.BeginTransaction() 來控制

範例程式

  1. string ora_con_str = ConfigurationManager.ConnectionStrings["ora_cnn_str"].ToString();
  2. string ms_con_str = ConfigurationManager.ConnectionStrings["ms_cnn_str"].ToString();
  3.  
  4. SqlConnection msDbConn = new SqlConnection(ms_con_str);
  5. OracleConnection oraDbConn = new OracleConnection(ora_con_str);
  6.  
  7. msDbConn.Open();
  8. oraDbConn.Open();
  9.  
  10. using (DbContext dbContextTT = new DbContext(oraDbConn, false))
  11. using (DbContext dbContextMS = new DbContext(msDbConn, false))
  12. {
  13. using (var transactionTT = dbContextTT.Database.BeginTransaction())
  14. using (var transactionMS = dbContextMS.Database.BeginTransaction())
  15. {
  16. try
  17. {
  18. sql = @"
  19. insert into TEST_ALEX(A,C) select '111', 33 from dual
  20. ";
  21. rec = dbContextTT.Database.ExecuteSqlCommand(sql);
  22.  
  23. sql = @"
  24. insert into A (A1, A2, A3) select 'A11','22','33'
  25. ";
  26. rec = dbContextMS.Database.ExecuteSqlCommand(sql);
  27.  
  28. transactionTT.Commit();
  29. transactionMS.Commit();
  30. }
  31. catch (Exception exp)
  32. {
  33. //不需要下Rollback, 後續離開[using transaction]的區塊, 會自動Rollback
  34. //MSSQL不知為何在執行失敗後, 會導致[transactionMS的connection變成null],無法執行Rollback, 但[transactionTT]卻不會發生connection為null情況, 可以正常執行Rollback
  35. //transactionMS.Rollback();
  36. //transactionTT.Rollback();
  37. throw exp;
  38. }
  39. }
  40. }

利用TransactionScope (資料庫需開啟[MSDTC, 分散式交易])

  1. using (TransactionScope scope = new TransactionScope())
  2. {
  3. using (var dbContext1 = new MyDbContext1()) // 第一个数据库上的 DbContext
  4. using (var dbContext2 = new MyDbContext2()) // 第二个数据库上的 DbContext
  5. {
  6. try
  7. {
  8. // 在 dbContext1 上执行操作
  9. var entity1 = new MyEntity1 { Name = "Entity 1" };
  10. dbContext1.MyEntities1.Add(entity1);
  11. dbContext1.SaveChanges();
  12.  
  13. // 在 dbContext2 上执行操作
  14. var entity2 = new MyEntity2 { Name = "Entity 2" };
  15. dbContext2.MyEntities2.Add(entity2);
  16. dbContext2.SaveChanges();
  17.  
  18. // 提交分布式事务
  19. scope.Complete();
  20. }
  21. catch (Exception ex)
  22. {
  23. // 处理异常
  24. Console.WriteLine($"发生异常: {ex.Message}");
  25. }
  26. }
  27. }

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 工作排程 DBMS_JOB 筆記

Oracle 例外控制(Exception Control)