简言:
- 这篇文章我要谈一谈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
原文地址:https://www.cnblogs.com/norain/p/sqlserver_DCS.html
时间: 2024-10-15 13:40:00