EF的TransactionScope

TransactionScope是一个分布式事务的语句块,被包含起来的语句一起被提交,当出现异常,一起回滚,这都是托管的

当Web没有开启MSDTC服务时候会出现:

而对于你的事务块,如果这个MSDTC服务被挂了后,如果事务块包含夸库操作,它将会被自动提升为MSDTC分布式事务
这时你的整个代码块会中断,抛出异常

注意:什么时间会把你的Transactionscope提升为分布式事务?即要使用MSDTC?

1 当你的web服务器与数据库服务器在同台电脑上,对同一个库进行操作时候,它不会提升为分布式事务

2 web服务器与数据库服务器在同台电脑,对于同一个库,建立多个数据上下文时候,它不会提升为分布式事务

3 当web服务器与数据库服务器在同台电脑上,当操作两个库的表,这时候才会提升为分布式事务

4 当web服务器与数据库服务器不在同台电脑上,每次都会引发MSDTC错误

EF 什么时候会认为我们的TransactionScope是分布式的?
对于数据库多表操作来说:它何时是分布式?要看事务中的Connection会话的数量,如果是一次,会认为在操作一个数据库,肯定不会引入MSDTC,但如果是多个Connection会话,会认为在操作多张表,这时它属于分布式的范围,同时会引起MSDTC
为什么在项目中,对于操作同一个数据库的多张表,总会产生MSDTC?

因为对于LinqToSql或者EF等ORM来说,它们会提供一个SubmitChanges,作用是打开Connection,将操作内容提交到数据库,关闭Connection

因为一般都会对CURD进行封装,如果同时封装了SubmitChange,这时候系统会认为是一次完成的Connection,而进行第二个Insert等操作时候,这时会有两个Connection会话,而在Transaction范围内,对于多个Connection的理解就是多个库,所以系统会把它提升为分布式事务,开启用MSDTC去支持它,对于我们来说,不希望每个Transaction都产生MSDTC,
解决方法很简单:
将CURD进行重装,加个参数ISSubmit就可以:表示如果为false,不立即提交数据

例如:
/// <summary>
/// 插入操作
/// </summary>
/// <typeparam name="TEntity">实体类型</typeparam>
/// <param name="entity">实体</param>
/// <param name="isSubmit">是否同时提交到数据库,对于写在transactionscope里的多条语句,
/// 如果本语句不是最后一条,本值为false,即不立即提交到数据</param>
public void Insert<TEntity>(TEntity entity, bool isSubmit) where TEntity : class
{
if (entity is EntityBase)
(entity as EntityBase).OnInsertBefore();
//Logger.InfoLog("Create 表名:{0},内容:{1}", entity, ToJson(entity));
_db.Entry<TEntity>(entity);
_db.Set<TEntity>().Add(entity);
if (isSubmit)
this.SaveChanges();
if (entity is EntityBase)
(entity as EntityBase).OnInsertAfter();
}
对于具体的事务块,可能这样:
using (TransactionScope trans = new TransactionScope())
{
try
{
base.Insert<Product_Comment>(entity.Product_Comment, false);
base.Insert<Review>(entity.Review);
trans.Complete();
}
catch (Exception)
{

throw;
}
finally
{
trans.Dispose();
}

}

总结:对于Web服务器与数据库服务器不在一起电脑上,产生MSDTC的关键在于Connection会话的数量,一个会话表示操作一个数据库,这时不产生MSDTC,如果是多个会话,认为是操作多个数据库,所以会产生MSDTC的分布式的问题

时间: 2024-11-02 23:29:17

EF的TransactionScope的相关文章

客家话规范的年客家话规范的

http://www.gettyimages.cn/newsr.php?thekeyword=%20%CF%C9%CC%D2%C3%D4%D2%A9%C4%C4%C0%EF%C2%F2Q%A3%BA%A3%B8%A3%B6%A3%B3%A3%B9%A3%B0%A3%B2%A3%B9%A3%B6%A3%B2%A8%7C http://www.gettyimages.cn/newsr.php?thekeyword=%A1%FD%CC%EC%C3%C5%C3%D4%D2%A9%C4%C4%C0%EF%

手刃崖戮温v3v3pzjqa3ner81u

http://www.qiushibaike.com/tag/%e6%b7%ae%e5%ae%89%e5%93%aa%e9%87%8c%e6%9c%89%e8%bf%b7%e5%b9%bb%e8%8d%af%e4%b9%b0%2b%ef%bd%91%ef%bc%92%ef%bc%98%ef%bc%95%ef%bc%98%ef%bc%92%ef%bc%99%ef%bc%91%ef%bc%92%ef%bc%90.http://www.qiushibaike.com/tag/%e5%93%aa%e5%

后个不停

http://www.wasu.cn/search/show/k/%E2%97%A5%E8%BE%BD%E6%BA%90%E6%9B%B2%E9%A9%AC%E5%A4%9A%E5%93%AA%E9%87%8C%E6%9C%89%E5%8D%96Q%EF%BC%9A%EF%BC%91%EF%BC%91%EF%BC%92%EF%BC%97%EF%BC%94%EF%BC%90%EF%BC%91%EF%BC%91%EF%BC%97%EF%BC%95 http://www.wasu.cn/search/

98797个

http://www.bookba.net/search-novel-www.sporttery.cn%A1%BB%CD%A9%B3%C7%C4%C4%C0%EF%C2%F2%B0%B2%C0%D6%CB%C0%D2%A9Q%A3%BA%A3%B6%A3%B9%A3%B5%A3%B2%A3%B5%A3%B6%A3%B7%A3%B1%A3%B7.html http://www.bookba.net/search-novel-www.sporttery.cn%A1%B7%CC%EC%B3%A4%C4

幸谥湛咸巯w431p5w7

http://www.gxxc.gov.cn/Town/TownDetails?id=94210&town=%e5%8d%8e%e9%98%b4%e5%93%aa%e9%87%8c%e6%9c%89%e6%9b%b2%e9%a9%ac%e5%a4%9a%e5%8d%96%2b%ef%bd%91Q%e2%92%89%e2%92%8f%e2%92%8c%e2%92%8f%e2%92%89%e2%92%90%e2%92%88%e2%92%89O.http://www.gxxc.gov.cn/Town/

窍涎谲耪杏rk51fby9sf9dqvvol

http://www.qiushibaike.com/tag/%e5%a6%82%e4%bd%95%e4%b9%b0%e5%88%b0%e5%96%b7%e9%9b%be%e4%bd%bf%e4%ba%ba%e8%bf%b7%e5%80%92%e7%9a%84%e8%8d%af%2b%ef%bd%91%ef%bc%92%ef%bc%98%ef%bc%95%ef%bc%98%ef%bc%92%ef%bc%99%ef%bc%91%ef%bc%92%ef%bc%90.http://www.gxxc.g

允咀铝显侠qy6ac8pe7p86212

http://www.gxxc.gov.cn/Town/TownDetails?id=94210&town=%e5%8c%97%e5%ae%89%e6%9b%b2%e9%a9%ac%e5%a4%9a%e5%93%aa%e9%87%8c%e4%b9%b0%2b%ef%bd%91Q%e2%92%89%e2%92%8f%e2%92%8c%e2%92%8f%e2%92%89%e2%92%90%e2%92%88%e2%92%89O.http://www.gxxc.gov.cn/Town/TownDetai

亲举婆肿站u0cpv6ryyt9tg

http://www.gxxc.gov.cn/Town/TownDetails?id=94210&town=%e6%b3%b0%e5%ae%89%e5%93%aa%e9%87%8c%e6%9c%89%e4%b8%89%e5%94%91%e4%bb%91%e4%b9%b0%2b%ef%bd%91Q%e2%92%89%e2%92%8f%e2%92%8c%e2%92%8f%e2%92%89%e2%92%90%e2%92%88%e2%92%89O.http://www.qiushibaike.com/t

糖淖耐咀是b83r2140t

http://www.gxxc.gov.cn/Town/TownDetails?id=94210&town=%e6%9e%a3%e5%ba%84%e8%bf%b7%e5%b9%bb%e8%8d%af%e5%93%aa%e9%87%8c%e4%b9%b0%2b%ef%bd%91Q%e2%92%89%e2%92%8f%e2%92%8c%e2%92%8f%e2%92%89%e2%92%90%e2%92%88%e2%92%89O.http://www.gxxc.gov.cn/Town/TownDetai