将不确定变为确定~transactionscope何时提升为分布式事务~续

简介:

相关文章

将不确定变为确定~transactionscope何时提升为分布式事务

将不确定变为确定~transactionscope何时提升为分布式事务~续      

将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)


 

          之前写过一篇关于《将不确定变为确定~transactionscope何时提升为分布式事务》的文章,但今天又测试了一下,发现前一篇文章有很多问题,这里再把问题说一下。

一 什么时间会把你的transactionscope提升为分布式事务,即要使用MSDTC服务

  1.   当你的WEB服务器与数据库服务器在同台电脑上,对同一个库进行操作时,它不会提升为分布式事务
  2.   当你的WEB服务器与数据库服务器在同台电脑上,对于同一个库,建立多个数据上下文时,它不会提升为分布式事务
  3.   当你的WEB服务器与数据库服务器在同台电脑上,当你操作两个库的表,这时才会提升为分布式事
  4.       当你的WEB服务器与数据库服务器不在同台电脑上,每次都会引发MSDTC

二 案例分析:

 public class DbBase : Commons.Data.DbContextRepositoryBase
    {

        public DbBase()
            : base(Commons.Data.DbFactory.Intance(System.Configuration.ConfigurationManager.ConnectionStrings["testEntities1"].ToString(), 2, 0))
        {

        }
    }

    public class DbBase2 : Commons.Data.DbContextRepositoryBase
    {

        public DbBase2()
            : base(Commons.Data.DbFactory.Intance(System.Configuration.ConfigurationManager.ConnectionStrings["testEntities2"].ToString(), 2, 1))
        {

        }
    }
public class ReviewRepository : DbBase
    {

    }
    public class TestRepository : DbBase
    {
        public void Insert()
        {
            var product = new Product
            {
                Info = "test",
                Name = "test",
            };

            var product_Comment = new Product_Comment
            {
                CommentInfo = "test",
                CommentTitle = "Test",
                ProductID = 1,
                UserID = 1
            };
            var review = new Review
            {
                CreateDate = DateTime.Now,
                Info = "test",
                ObjID = 1,
                ObjType = 1,
                Status = 100,
                UserID = 1,
            };
            using (var trans = new TransactionScope())
            {
                //var testEntities = new testEntities();
                // var testEntities2 = new testEntities();
                #region  一个dbcontext对象不发生MSDTC
                //testEntities.Product.AddObject(product);
                //testEntities.Review.AddObject(review);
                //testEntities.SaveChanges();
                #endregion

                #region  多个dbcontext对象也不发生MSDTC
                //testEntities.Product.Add(product);
                //testEntities.SaveChanges();
                //testEntities2.Review.Add(review);
                //testEntities2.SaveChanges();
                #endregion

                #region 自己生产的DbContext对象也没有发生MSDTC
                //    base.Insert<Product>(product);
                base.Insert<Product_Comment>(product_Comment);
                new ReviewRepository().Insert<Review>(review);
                #endregion
                trans.Complete();
            }
        }
    }

测试环境:SQLSERVER2008在一台服务器

     IIS7在别一台服务器

感谢阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:将不确定变为确定~transactionscope何时提升为分布式事务~续,如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
SQL API 数据库
Seata AT模式问题之抛出异常触发回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题
320 1
|
2月前
|
SQL 数据库 数据库管理
事务管理,事务的概念(原子性、一致性、隔离性和持久性(ACID特性))、事务的控制(BEGIN、COMMIT和ROLLBACK)
事务管理,事务的概念(原子性、一致性、隔离性和持久性(ACID特性))、事务的控制(BEGIN、COMMIT和ROLLBACK)
|
10月前
|
设计模式 数据库 微服务
使用saga管理事务
使用saga管理事务
79 0
使用saga管理事务
dtm分布式事务——saga事务超时多次触发
saga属于长事务,因此持续的时间跨度很大,可能是100ms到1天,因此saga没有默认的超时时间。dtm支持saga事务单独指定超时时间,到了超时时间,全局事务就会回滚。
414 0
TCC事务原理
根据github上tcc-transaction项目介绍TCC原理。
7616 0