当前位置: 代码迷 >> Sql Server >> 跨数据库事务管控机制该如何避免,求具体思路
  详细解决方案

跨数据库事务管控机制该如何避免,求具体思路

热度:4   发布时间:2016-04-24 20:04:55.0
跨数据库事务管控机制该如何处理,求具体思路
现在想实现跨数据库的事务:
比如:在本地(Oracle)插入一条用户信息,同时远程SQLSERVER数据库中删除一条数据(主键相同),保证两个操作在一个事务中完成.

说明一点:本地的数据库和远程的数据库的库结构是完全一样的.

大家谁有这方面的经验,多多指导!!!

------解决方案--------------------
1、建立db_link;
2、建议用存储过程来实现插入操作(存储过程中用事务);
3、前台程序再调用存储过程。
------解决方案--------------------
在所有需要用到事务的地方都显式定义being tran 然后显示commit/rollback,或者使用xact_abort选项来保证事务的逻辑一致性
------解决方案--------------------
MSSQL服务器这边,MSDTC服务需启动.
------解决方案--------------------
类似这样的代码,就可以实现分布式是事务:

分布式事务
Oracle 有很多很好的特性,其中之一就是能够透明地处理分布式事务。在一个事务的范围内,可以
更新多个不同数据库中的数据。提交时,要么提交所有实例中的更新,要么一个都不提交(它们都会回滚)。
为此,我不需要另外编写任何代码:只是“提交“就行了。
Oracle 中分布式事务的关键是数据库链接(database link)。

--建立database link
CREATE  PUBLIC DATABASE LINK hisdb
CONNECT TO easyrep IDENTIFIED BY easyrep
USING 'repdb';

--插入远程数据库表记录
insert into table  sss@hisdb values( ... );

--删除本地数据库表记录
delete from sss where id= ... ;

------解决方案--------------------
建立远程链接服务器,并且保证两个语句在同一个事务中完成:

exec sp_addlinkedserver '链接名称',' ','SQLOLEDB','192.168.xx.xxx'
exec sp_addlinkedsrvlogin '链接名称','false',NULL,'sa','xxxxxxx'
....


建立存储过程执行 :

SET XACT_ABORT ON 
begin tran
insert into table1().....

delete 链接名称.数据库名.dbo.table1 where .....

commit tran

------解决方案--------------------
不管目标服务器事务控制如何,原服务器都应该做好严密的事务控制
  相关解决方案