sql >> Database teknologi >  >> RDS >> Sqlserver

trigger og transaktioner på midlertidige tabeller

Jeg tror ikke, du forstår udløsere – udløserudløsning er forbundet med udsagnet om, at de er relateret til, snarere end når transaktionen forpligtes. To scripts:

Script 1:

create table T1 (
    ID int not null,
    Val1 varchar(10) not null
)
go
create table T2 (
    ID int not null,
    Val2 varchar(10) not null
)
go
create trigger T_T1_I
on T1
after insert
as
    insert into T2 (ID,Val2) select ID,Val1 from inserted
go
begin transaction
insert into T1 (ID,Val1)
select 10,'abc'
go
RAISERROR('Run script 2 now',10,1) WITH NOWAIT
WAITFOR DELAY '00:01:00'
go
commit

Script 2:

select * from T2 with (nolock)

Åbn to forbindelser til den samme DB, sæt et script i hver forbindelse. Kør script 1. Når det viser beskeden "Kør script 2 nu", skal du skifte til den anden forbindelse. Du vil se, at du er i stand til at vælge ikke-forpligtede data fra T2, selvom disse data er indsat af udløseren. (Dette indebærer også, at passende låse holdes på T2 af script 1, indtil triggeren commits).

Da dette indebærer, at det, du beder om, bare er at indsætte i basistabellen og holde din transaktion åben, kan du gøre det.

Hvis du vil skjule tabellens faktiske form for brugerne, skal du oprette en visning og skriv triggere på det for at opdatere basistabellerne. Men som nævnt ovenfor, så snart du har udført en DML-operation mod visningen, vil triggerne være udløst, og du vil holde låse mod basisbordet. Afhængigt af transaktionsisolationsniveauet for andre forbindelser kan de se dine ændringer eller blive blokeret, indtil transaktionen forpligtes.



  1. Generering af XML PLSQL Iterativ

  2. ORA-00838

  3. Beregn det maksimale antal samtidige brugersessioner

  4. Brug af en NoSQL-database over MySQL