Sqlserver分布式跨数据库查询、Join,以及分布式事务
简言:
- 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理
SqlServer跨服务器查询的方式
- 以往自己才疏学浅,学习了一波之后,在这记录下来。
1. 使用sp_addlinkedserver和sp_addlinkedsrvlogin存储过程添加linkserver和登录
--别名 //ip地址
exec sp_addlinkedserver 'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
--别名 --登录名 --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
--注意:两个别名要一致 --然后就可以通过以下方式进行联合查询:
--上面的别名 --数据库名
select * from [v3cdemo].[dbo].[AmmUnit] as ad1 right join interlink.[v3cdemo].
--表名
[dbo].[Address] as ad2 on ad1.unitID=ad2.AddressID --删除某个linkserver
exec sp_dropserver 'interlink ', 'droplogins '
运行效果如图:
2. 使用openrowset函数
exec sp_configure 'show advanced options',1
go
RECONFIGURE WITH OVERRIDE; --这里一定要加 with override 不然会出现不允许修改错误 exec sp_configure 'Ad Hoc Distributed Queries',1
go
RECONFIGURE WITH OVERRIDE;
--ip地址 --用户名 --密码
select * from openrowset( 'SQLOLEDB ', '192.168.0.12 '; 'sa'; '*bf123',[v3cdemo].[dbo].[Address]) --数据库.表名 exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure --1. 有关 show advanced options的介绍请阅读:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2005/ms188265(v=sql.90)
--2. Ad Hoc Distributed Queries :分散式查询。
- 运行结果如下:
3. 使用openquery函数
- openquery是基于linkserver实现的,得先添加一个linkserver
--别名 //ip地址
exec sp_addlinkedserver 'interlink','','SQLOLEDB', 'xxx.xxx.xx.xx'
--别名 --登录名 --密码
exec sp_addlinkedsrvlogin 'interlink', 'false ',null, 'xxx', 'xxxxx'
--使用openquery函数
select * FROM openquery(interlink, 'SELECT * FROM [v3cdemo].[dbo].[Address] ') --也可以把本地表导入到服务器表
--insert openquery(interlink, 'SELECT * FROM dbName.dbo.tableName ') select * from localTableName
运行结果如图:
4. 使用opendatasource函数
SELECT * FROM opendatasource( 'SQLOLEDB ', 'Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx' ).[v3cdemo].[dbo].[Address] --[v3cdemo]:是数据库名
--[dbo].[Address]:是表名
--Data Source=xxx.xxx.x.xx;User ID=xx;Password=xxx这个类似于我们的连接字符串,只是不需要指定数据库。运行结果如图:
SqlServer分布式事务:
- .net framework:
- TransactionScpoe:TransactionScope是ADO.Net提供的事务机制(需要添加对system.transactioins程序集的引用),在普通ADO.Net代码中也可以用、在Entity Framework、Dapper等ORM中也可以用;把相关需要事务处理的代码用TransactionScope包裹起来即可,只要没有Complete()的就会回滚
深入:
使用TransactionScope包围的范围,只要是同一个连接字符串创建的SqlConnection对象(MySQL等也支持),即使是多个Connection对象也会在一个事务中。
还支持嵌套事务,这个在开发大型系统中会涉及到,因为大型系统中一个方法会在很多地方被使用,一个方法有时候是自己独立完成一件事情,有时候是被别人组合完成一件事。 TransactionScope可以嵌套, TransactionScope嵌套的情况,只有最外层的TransactionScope提交后所有的操作才会提交,否则所有操作都回滚。注意:如果在TransactionScope嵌套的范围内出现多个不同连接字符串构成的Connection(比如同时连接多个同构或者异构的数据库)则需要启用MSDTC服务,否则会“MSDTC不可用”的异常,即使数据库ip地址从127.0.0.1变成localhost甚至加上一个无关痛痒的空格都会要求启用MSDTC服务。
- .net core:
- 因为.net core已经是跨平台了,而MSDTC服务是windows平台的东西,所以.net core 中的Transactionscope实现不包括对分布式事务的支持,因此不能使用 TransactionScope 或CommittableTransaction 来跨多个资源管理器协调。
- 可以使用 **Saga ** 来实现事务一致性:https://www.upyun.com/opentalk/310.html(saga只支持postpresql和mysql数据库。偷懒)
- sage GitHub地址C#包:https://github.com/OpenSagas-csharp/servicecomb-pack-csharp
Sqlserver分布式跨数据库查询、Join,以及分布式事务的更多相关文章
- 一条SQL完成跨数据库实例Join查询
背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...
- 不同SQL Server数据库之间的跨数据库查询
--不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...
- Sqlserver 2005 跨数据库 导入数据
--Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...
- ORACLE跨数据库查询的方法
原文地址:http://blog.csdn.net/huzhenwei/article/details/2533869 本文简述了通过创建database link实现Oracle跨数据库查询的方法 ...
- 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
在上篇随笔中,我们发现Entity Framework在构建SQL语句时,将ToTable("CNBlogsTex.dbo.blog_PostBody")中的"CNBlo ...
- 如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参
[前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC ...
- SQL SERVER SP命令及实现跨数据库查询
1.数据库: (1)sp_helpdb:报告有关指定数据库或所有数据库的信息. 例:sp_helpdb --显示所有数据库信息(名称.大小等) 例:sp_helpdb Recruitment ...
- 基于双下划线的跨表查询 (join查询)
因为你的数据库中的查询就是重点 那么你的django提供的orm也是查询语句最重点 ,也提供的查询方法比较的多,下面我们学习下类似于MYSQL的连表(join)查询 Django 还提供了一种直观而 ...
- SQL分布式查询、跨数据库查询
--[方法1]连接服务器方法 --step1 创建链接服务器 exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB', 'ip地址' exec sp ...
- SQL Server 跨数据库查询
语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * F ...
随机推荐
- ELK 性能优化实践 ---总结篇
版本及硬件配置 JDK:JDK1.8_171-b11 (64 位) ES集群:由3台16核32G的虚拟机部署 ES 集群,每个节点分配 20 G 堆内存 ELK版本:6.3.0 垃圾回收器:ES 默认 ...
- 面试突击86:SpringBoot 事务不回滚?怎么解决?
在 Spring Boot 中,造成事务不自动回滚的场景有很多,比如以下这些: 非 public 修饰的方法中的事务不自动回滚: 当 @Transactional 遇上 try/catch 事务不自动 ...
- 中小制造企业需要ERP和MES吗?
并不是所有中小制造企业都需要ERP和MES,这个取决于你的规模和管理思维与模式!匹配很重要,不同规模的企业做不同的选择!比如你大型企业,一般是要使用ERP的,其工厂也应该需要上MES系统,ERP主要用 ...
- 【Spring boot】启动过程源码分析
启动过程结论 推测web应用类型. spi的方式获取BootstrapRegistryInitializer.ApplicationContextInitializer.ApplicationCont ...
- 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传
前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...
- HDU3506 Monkey Party (区间DP)
一道好题...... 首先要将环形转化为线形结构,接着就是标准的区间DP,但这样的话复杂度为O(n3),n<=1000,要超时,所以要考虑优化. dp[i][j]=min( dp[i][k]+d ...
- 个人音乐博客 h5、css和js等
浅说一下吧 这个小项目由h5和css还有js和jq写的 主题内容为个人音乐 博客等 首页一级导航栏 以及侧边栏 整合部分图标(侧边栏未添加收起操作 时间原因 会的朋友们可以自行添加一个动画就可以 在m ...
- TomCat之安装
TomCat 之安装(伪分布式版本) 本次安装是使用的伪分布式的安装(即一台机器安装两个tomcat) 1.通过scp导入tomcat安装包 2.解压缩成俩个文件 3.修改第一个tomcat的配置文件 ...
- `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
<jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...
- 2022最新最详细必成功的在Vscode中设置背景图、同时解决不受支持的问题
文章目录 1.效果展示 2.设置背景图的详细步骤 2.1 .下载background插件 2.2 .选择扩展设置 2.3 .在setting.json中编辑 2.4.对应的配置文件 2.5 .重启电脑 ...



