A,B 2个SQL SERVER 2008数据库,分别在不同的服务器上。当A库的TableA 插入一条数据的时候,将B库中TableB 中对应的记录更新状态。
原计划是写一个服务来定时同步,但用户要的紧,就写了一个触发器+链接服务器来实现。中间碰到一些问题这里做一下总结
模拟数据
|
create database A go use A go CREATE TABLE TableA ( id int, MapId int ) |
|
INSERT INTO TableB VALUES (1,0) INSERT INTO TableB VALUES (2,0) INSERT INTO TableB VALUES (3,0) |
实现
|
exec sp_addlinkedserver 'Server1', '', 'SQLOLEDB', '192.168.50.1'
exec sp_addlinkedsrvlogin 'Server1', 'false', NULL, 'sa', 'mamahao' |
|
CREATE TRIGGER tg_insert_TableA ON tableA AFTER INSERT AS BEGIN DECLARE @MAPId INT
SELECT @MAPId = MapID FROM INSERTED
UPDATE SERVER1.B.dbo.TableB SET STATE = 1 WHERE MAPID = @MAPId END |
|
INSERT INTO tableA VALUES (1,1) |
分析
解决
|
ALTER TRIGGER tg_insert_TableA ON tableA AFTER INSERT AS BEGIN DECLARE @MAPId INT
SELECT @MAPId = MapID FROM INSERTED
COMMIT
UPDATE SERVER1.B.dbo.TableB SET STATE = 1 WHERE MAPID = @MAPId
BEGIN TRAN END |
|
INSERT INTO tableA VALUES (1, 1)
PRINT '当前事物' + CONVERT(VARCHAR, @@TRANCOUNT) |
而且@@Trancout 在这这个回话中是0值。说明事务都提交了。
反思
- 虽然数据是更新成功达到目的,但是为什么这样写触发器不会错,事务可以提交? 我做了另外一个试验,总结完成再记录一篇随笔。
- 有没有其他的办法,可以满足分布式事务提交? 有空要仔细研究研究。
- 这种触发器的方案,看起来是解决了问题,但是以后维护会不会不记得有触发器这个东西?