1st Oct

MS-SQL autonóm tranzakció

Wednesday, October 1, 2014 - 21:28
0
Author: Fegyver Gyula

Az ORACLE -ben elérhető autonóm tranzakció működése igen egyszerű, és kényelmes. Hasonló megvalósítás jelenleg nem létezik az SQL-Server -hez. Tipikus igény a technika használatára, amikor egy LOG táblát írunk egy adott funkció végrehajtása közben. A funkció véget érhet azzal, hogy a tranzakció nem véglegesül, de a alapvető igényünk, hogy a LOG bejegyzések mindenképpen (függetlenül a FŐ tranzakciótól) COMMIT -tal záródjon. Vagyis a "belső" tranzakció képes legyen véglegesülni akkor is, ha a fő tranzakció ROLLBACK -kel is végződik.

A működés alapja egy LINKED szerver készítése, és az azon keresztül meghajtott belső tranzakció.

Példa a használatra:

1.) Tábla létrehozások

create table log (dt datetime, name varchar(32));
create table data (id int identity (1,1), name varchar(128));
 
2.) Eljárások létrehozása
 
LOG bejegyzésre készített eljárás:
create procedure set_log (@av_name varchar(32)) as
begin
  insert into log values (getdate(), @av_name);
end;
 
Példa eljárás a FŐ funkció implementálására:
create procedure process (@av_name varchar(128)) as
declare @v varchar(128);
begin
  set @v = 'attempt' + '_' + @av_name;
  exec loopback.<db>.dbo.set_log @v;
  insert into data values (@av_name);
end;
 
3.) Tesztelés
begin tran
exec process 'a';
exec process 'b';
commit tran;
 
begin tran
exec process 'c';
rollback;
 
select * from log;
select * from data;
 
.. és az eredmény:
 
 
Összefoglalva a lényege az SQL-Server -n belüli "független" tranzakció kezelés fenti implementációjának, hogy az un. belső tranzakció (tipikusan LOG írás) egy LINKED SERVER -n keresztül hajtódik meg, aminek nem engedélyeztük a DISTRIBUTED TRANSACTION kezelést.
 
LINKED SERVER létrehozása
EXEC sp_addlinkedserver @server = N'loopback', @srvproduct = N' ', @provider = N'SQLNCLI', @datasrc = @@SERVERNAME;
 
LINKED SERVER paraméterezése 
EXEC sp_serveroption loopback, N'rpc out''true';
EXEC sp_serveroption loopback, N'remote proc transaction promotion', 'false';
Comments (0)
0