关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?
背景:
事务是数据库管理系统的一个基本概念,事务具有四个基本特点,即ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),通过事务机制可以保证数据库的一致性和完整性。
不过数据库事务只能在数据库实例的同一个会话级别进行事务控制。而分布式事务可以协调一个数据库实例多个会话之间的操作,甚至是多个数据库实例之间的数据库操作,并保持事务特性。但是原则上我们不推荐使用分布式事务,因为分布式事务对资源消耗较多,执行效率较差。
然而一直以来,我们对分布式事务的代码使用和效果都存在误解:使用了TransactionScope就一定会开启分布式事务吗?
验证:
我们做一个简单的Demo:两个连接字符串完全相同,ADO.NET会复用连接池中的连接,结果会如何?
using (TransactionScope ts = new TransactionScope())
{
SqlConnection conn;
conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa"); conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select 1 as tkk";
cmd.ExecuteNonQuery();
conn.Close(); conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa");
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "select 2 as tkk";
cmd.ExecuteNonQuery();
conn.Close(); ts.Complete();
} Console.WriteLine("OK");
Console.ReadKey();
奇怪的事情发生了,并没有看到我们的以为的分布式事务!!!

我们更改其中的一个连接字符串,使得ADO.NET认为是两个数据源,这样才会真正意义上开启分布式事务。
using (TransactionScope ts = new TransactionScope())
{
SqlConnection conn;
conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa"); conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select 1 as tkk";
cmd.ExecuteNonQuery();
conn.Close(); conn = new SqlConnection("server=.;uid=tkk123;pwd=aaaaaa;"); --加了一个分号,不共享连接
conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "select 2 as tkk";
cmd.ExecuteNonQuery();
conn.Close(); ts.Complete();
} Console.WriteLine("OK");
Console.ReadKey();
让我们看一下分布式事务是如何协调每个数据库连接,当前的案例我们使用的是同一个数据库,所以虽然建立了两个数据库连接,但最终在数据库层面仍然是同一事务ID。
如果我们打开的是两个不同数据库实例,将会看到什么样的结果呢? try it。。。

关于分布式事务的一个误解:使用了TransactionScope就一定会开启分布式事务吗?的更多相关文章
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- 对 COM+ 组件进行了方法调用,但该组件有一个已被中止的或正在被中止的事务。 (异常来自 HRESULT:0x8004E003)
错误: 对 COM+ 组件进行了方法调用,但该组件有一个已被中止的或正在被中止的事务. (异常来自 HRESULT:0x8004E003) 解决办法: 程序连接的数据库换到本地. 具体原因没搞 ...
- 对Spring事务的一些误解
提起spring事务,就会让人联想起四大基本特征,五个隔离级别,七大传播特性.相信大多数人都知道这些东西,但是知道是一回事情,能用好真的是另一回事了.在使用Spring事务的时候,我曾遇到过几个比较严 ...
- 使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。
使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务.
- Java中的多表&事务&DCL&一个多表操作例子
准备sql: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO d ...
- 分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
https://github.com/jaegertracing/jaeger https://mp.weixin.qq.com/s/-Tn2AgyHoq8pwMun8JHcGQ Jaeger的深入分 ...
- 发现Spring事务的一个实锤bug,官方还拒不承认?你来评评理...
你好呀,我是歪歪. 事情是这样的,上周我正在全神贯注的摸鱼,然后有个小伙伴给我发来微信消息,提出了自己关于事务的一个疑问,并配上两段代码: 先说结论:我认为这是 Spring 事务的一个 bug.但是 ...
- 开启分布式事物DTC
1.web服务器开启分布式事物配置后,数据库服务器的host文件要设置 “IP web服务器主机名” 的映射,否则会 出现 “与基础事务管理器的通信失败” #跨网段使用TransactionSco ...
- 第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码
第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码 scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开 ...
随机推荐
- [蟒蛇菜谱]Python函数参数传递最佳实践
将函数作为参数传递,同时将该函数需要的参数一起传递.可参考threading.Timer的处理方式: class threading.Timer(interval, function, args=[] ...
- MVC之路随记1--Filter的应用
功能:MVC提供过滤器Filter,使开发者不用复杂的实现AOP而直接用Filter实现同样的功能. 实现:1.定义一个类实现ActionFilterAttribute,重载借口中的方法后在Contr ...
- prompt弹框返回输入的文本
演示网址链接http://www.w3school.com.cn/jsref/met_win_prompt.asp <html> <head> <script type= ...
- java开发命名规范
使用前注意事项: 1. 由于Java面向对象编程的特性, 在命名时应尽量选择名词 2. 驼峰命名法(Camel-Case): 当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,首 ...
- nfs文件系统挂载错误及解决方法
挂载nfs时出现如下错误: 原因: 没有安装nfs客户端相关 解决方法: apt-get install nfs-common 参考资料: http://askubuntu.com/questions ...
- NPOI读取Excel 数据 转。。。
public DataTable am_Decode() { DataTable table = new DataTable(); string[] strAscDataList = Direct ...
- WCF 部署在Windows 2012 IIS上各种报错的解决方法
1.由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本 ,请添加处理程序.如果勇载文件,请添加 MIME 映射. 以管理员身份,在cmd中运行C:\Windows\Microsoft.NET\F ...
- 4.Rabbits and Recurrence Relations
Problem A sequence is an ordered collection of objects (usually numbers), which are allowed to repea ...
- js判断类型方法
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null,Boolean, Number和String:复杂数据类型是Object,Object中 ...
- React(JSX语法)----JSX拼写
注意:For DOM differences,such as the inline style attribute,check here. // bad: it displays "FIrs ...