[MSSQL] Insert onafhankelijk van de transaction

Pagina: 1
Acties:

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Ik heb een aantal Stored Procedures, deze worden van uit een applicatie in een transactie gedraaid. Is het mogelijk om in deze Stored Procedure een insert te doen ongeacht of de transactie gecommit word of niet.

Ik wil namelijk een aantal gegevens loggen, ongeacht wat de applicatie doet.

Programmer - an organism that turns coffee into software.


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Kan je in je SP geen andere transactie beginnen, waarbij je die INSERT doet ?

code:
1
2
3
BEGIN TRAN
  INSERT INTO ...
COMMIT TRAN

:?

* whoami weet niet zeker of dit wel werkt...

https://fgheysels.github.io/


Verwijderd

Hoort de stored procedure wel in de transactie thuis dan?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 02 september 2005 @ 12:06:
Hoort de stored procedure wel in de transactie thuis dan?
Voor logging doeleinden kan ik me er idd nog wel iets bij voorstellen.
Ik zou idd het voorstel van whoami eens proberen. dat lijkt me de beste oplossing.

[edit]
mmm het lijkt er toch op dat een inner transaction alsnog gerollbacked wordt als de parent transaction rollback wordt

[ Voor 17% gewijzigd door Woy op 02-09-2005 12:24 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

rwb schreef op vrijdag 02 september 2005 @ 12:20:
Voor logging doeleinden kan ik me er idd nog wel iets bij voorstellen.
Ik zou idd het voorstel van whoami eens proberen. dat lijkt me de beste oplossing.
Dat was het eerste wat mij ook te binnen schoot, maar ook logging behoort naar mijn mening niet binnen een transactie.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 02 september 2005 @ 12:31:
[...]
Dat was het eerste wat mij ook te binnen schoot, maar ook logging behoort naar mijn mening niet binnen een transactie.
Het ligt eraan op welk nivo je wilt loggen. Ik kan me best voorstellen dat je wat op database nivo wilt loggen en dat je op applicatie nivo een transaction start. De logging is dan niet van belang voor de applicatie en die start dus ook gewoon een transaction om te zorgen dat zijn data correct is.
Ik weet niet precies wat de logs van de database zelf opslaan maar mischien is dat in dit geval niet genoeg.
Verder kan ik idd ook niet echt dingen bedenken die je buiten je transaction wilt houden. Als je op applicatie nivo wilt loggen moet je het idd gewoon buiten de transaction houden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
rwb schreef op vrijdag 02 september 2005 @ 12:20:
[...]
[edit]
mmm het lijkt er toch op dat een inner transaction alsnog gerollbacked wordt als de parent transaction rollback wordt
Ook als die inner transaction ondertussen ge-commit is ?
Hmm, kan zijn. Ik had het niet getest.

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ook als die inner transaction ondertussen ge-commit is ?
Hmm, kan zijn. Ik had het niet getest.
volgens de MSSQL documentatie ieder geval wel
SET QUOTED_IDENTIFIER OFF
GO
SET NOCOUNT OFF
GO
USE pubs
GO
CREATE TABLE TestTrans(Cola INT PRIMARY KEY,
Colb CHAR(3) NOT NULL)
GO
CREATE PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3) AS
BEGIN TRANSACTION InProc
INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
COMMIT TRANSACTION InProc
GO
/* Start a transaction and execute TransProc */
BEGIN TRANSACTION OutOfProc
GO
EXEC TransProc 1, 'aaa'
GO
/* Roll back the outer transaction, this will
roll back TransProc's nested transaction */
ROLLBACK TRANSACTION OutOfProc
GO
EXECUTE TransProc 3,'bbb'
GO
/* The following SELECT statement shows only rows 3 and 4 are
still in the table. This indicates that the commit
of the inner transaction from the first EXECUTE statement of
TransProc was overridden by the subsequent rollback. */
SELECT * FROM TestTrans
GO

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 10:06

curry684

left part of the evil twins

whoami schreef op vrijdag 02 september 2005 @ 12:43:
[...]

Ook als die inner transaction ondertussen ge-commit is ?
Hmm, kan zijn. Ik had het niet getest.
Dat is het hele idee achter nested transactions :)

Een transaction is als geheel altijd per definitie een all-or-nothing situatie (de A van ACID). Een nested transaction is voornamelijk nuttig om lock contingency te voorkomen binnen een grote transaction, en natuurlijk binnen stored procedures, zou erg lullig zijn als het resultaat van een beveilige SP wel gecommit zou worden terwijl de transaction als geheel faalt.

[ Voor 15% gewijzigd door curry684 op 02-09-2005 13:10 ]

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 30-04 15:31
Idd, je hebt gelijk.

https://fgheysels.github.io/

Pagina: 1