TransactionScope事务对多个数据库的操作
.Net 2.0引入了轻量级事务管理器(Lighweight Transaction Manager),即System.Transactions.TransactionManager。
轻量级事务管理器具有最小的开销,对比使用轻量级事务管理器的事务和直接使用本地事务,并没有性能上的差别。
如果一个事务里只有一个资源管理器,轻量级事务管理器可以让资源管理器来管理该事务,而轻量级事务管理器只负责监视他;如果轻量级事务管理器发现有另外一个资源管理器被加入到事务中,轻量级事务管理器则会让原来的资源管理器释放控制权,并将控制权交给分布式事务处理器协调。
控制权在事务还在进行时转移给分布式事务处理协调器的这个过程称为事务升级(promotion pf a transaction)。
使用Demo
1)在要程序中添加system.TransAction.dll程序集的引用。如图:
2)使用TransActionScope。
1 using (TransactionScope tan = new TransactionScope()) 2 { 3 //向第一个数据库的Fm_ArticlePro添加一条数据 4 RySfEntities db1 = new RySfEntities(); 5 Fm_ArticlePro fmArticle = new Fm_ArticlePro(); 6 fmArticle.FArP_DepID = 1; 7 fmArticle.FArP_DepName = "ceshi"; 8 fmArticle.FArP_Time = DateTime.Now.ToLongTimeString(); 9 db1.Fm_ArticlePro.Add(fmArticle); 10 db1.SaveChanges(); 11 12 //int n = 0; 13 //int m = 9/n;//故意制造错误来测试是否插入数据 14 15 //向另外一个数据库Department表添加一条数据 16 ESIMSDataEntities1 db2 = new ESIMSDataEntities1(); 17 Department d = new Department(); 18 d.Dept_ID = 1; 19 d.Dept_Description = DateTime.Now.ToLongTimeString(); 20 d.Dept_Name = "ceshi"; 21 db2.Department.Add(d); 22 db2.SaveChanges(); 23 24 tan.Complete(); 25 }
3)启动DTC服务。
桌面右击“计算机” —> 管理 —> 服务和应用程序 —> 服务。
或者用命令启动:net start msdtc;
4)运行测试。
总结:很多时候,我们都只是做了第一步和第二步,而忘记启动协调跨多个数据库的DTC服务。这样就会出现一个错误,如下。
---------------------------
---------------------------
错误:基础提供程序在 Open 上失败。
---------------------------
确定
---------------------------
出现错误了数据也不会被插入到数据库。
说明:在步骤2)中是使用的隐式方法(使用system.Transactions.TransactionScope类),该方法更加灵活,因此更加适合。显示方法会使用system.Transactions.CommittableTransaction类。