Ist es immer eine schlechte Praxis, eine Transaktion zu erstellen?
Es hängt davon ab, über welchen Kontext Sie hier sprechen. Wenn es sich um ein Update handelt, kann ich die Verwendung von TRANSACTIONS ausdrücklich empfehlen. Wenn es ein SELECT ist, dann NO (explizit).
Aber warten Sie, es gibt mehr zu verstehen: Alles in SQL Server ist in einer Transaktion enthalten.
Wenn die Sitzung Option IMPLICIT_TRANSACTIONS
ist OFF
und Sie explizit angeben , begin tran
und commit/rollback
dann wird dies allgemein als bekannt explizite Transaktion . Andernfalls erhalten Sie eine Autocommit-Transaktion.
Wenn IMPLICIT_TRANSACTIONS
wird ON
eine implizite Transaktion wird automatisch gestartet , wenn eine der Anweisungstypen dokumentierten in den Bücher Online - Artikel Ausführung (zB SELECT
/ UPDATE
/ CREATE
) und es muss wieder ausdrücklich verpflichtet oder gerollt werden. Das Ausführen von BEGIN TRAN
in diesem Modus würde eine @@TRANCOUNT
weitere "verschachtelte" Transaktion inkrementieren und starten.)
Um zu wechseln, in welchem Modus Sie sich befinden, verwenden Sie
SET IMPLICIT_TRANSACTIONS ON
oder
SET IMPLICIT_TRANSACTIONS OFF
select @@OPTIONS & 2
Wenn oben 2 zurückgegeben wird, befinden Sie sich im impliziten Transaktionsmodus. Wenn es 0 zurückgibt, werden Sie automatisch festgeschrieben.
Wie hoch sind die Kosten für die Erstellung einer Transaktion, wenn dies nicht wirklich erforderlich ist?
Transaktionen sind erforderlich, um die Datenbank von einem konsistenten Zustand in einen anderen konsistenten Zustand zu versetzen. Transaktionen sind kostenlos, da es keine Alternative zu Transaktionen gibt. Siehe: Verwenden von zeilenversionsbasierten Isolationsstufen
Auch wenn Sie eine Isolationsstufe verwenden read_uncomitted. Ist eine schlechte Praxis? weil es keine Probleme mit dem Sperren haben sollte.
Die Isolationsstufe READ_UNCOMMITED ermöglicht per Definition Dirty Reads, dh eine Transaktion kann nicht festgeschriebene Änderungen sehen, die von einer anderen Transaktion vorgenommen wurden. Diese Isolationsstufe lockert den Overhead des Sperrens - eine Methode zum Abrufen von Sperren zum Schutz der gleichzeitigen Verwendung von Datenbanken.
Sie können dies auf Verbindungs- / Abfrageebene verwenden, sodass andere Abfragen davon nicht betroffen sind.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Es wurde ein interessanter Artikel von Jeff Atwood gefunden, der Deadlocks aufgrund von Dining Philosophers Puzzle beschreibt und die von Lesern festgelegte Snapshot- Isolationsstufe beschreibt.
BEARBEITEN:
Aus Neugier habe ich einige Tests durchgeführt, um die Auswirkung auf T-Log mit Perfmon-Zählern wie Log Bytes Flushed / Sek., Log Flush Waits / Sek. (Anzahl der Commits pro Sek., Die darauf warten, dass LOG Flush ausgeführt wird) zu messen.
Beispielcode :
create table testTran (id int, Name varchar(8))
go
-- 19 sec
-- Autocommit transaction
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
---------------------------------------------------
-- 2 sec
-- Implicit transaction
SET IMPLICIT_TRANSACTIONS ON
declare @i int
set @i = 0
while @i < 100000
begin
insert into testTran values (1,'Kin Shah')
set @i = @i+1
end
COMMIT;
SET IMPLICIT_TRANSACTIONS OFF
----------------------------------------------------
-- 2 sec
-- Explicit transaction
declare @i int
set @i = 0
BEGIN TRAN
WHILE @i < 100000
Begin
INSERT INTO testTran values (1,'Kin Shah')
set @i = @i+1
End
COMMIT TRAN
Transaktionen automatisch festschreiben : (Bearbeitet wie von @TravisGan hervorgehoben)
- Einfügen dauerte 19 Sekunden.
- Bei jedem Autocommit wird der T-Log-Puffer aufgrund von Autocomit auf die Festplatte gespült (nachdem @TravisGan markiert wurde und ich dies nicht erwähnt habe).
- Der CHECKPOINT-Prozess wird schnell abgeschlossen, da der zum Löschen erforderliche Puffer für verschmutzte Protokolle geringer ist, da er häufig leise ausgeführt wird.
IMPLICIT & Explicit Transaction:
- Einfügen dauerte 2 Sekunden.
- Bei einer EXPLICIT-Transaktion werden die Protokollpuffer nur geleert, wenn sie voll sind.
- Im Gegensatz zur Autocommit-Transaktion dauert der CHECKPOINT-Vorgang in der EXPLICIT-Transaktion länger, da mehr Protokollpuffer gelöscht werden müssen (denken Sie daran, dass Protokollpuffer nur dann gelöscht werden, wenn sie voll sind).
Es gibt eine DMV sys.dm_tran_database_transactions , die Informationen zu Transaktionen auf Datenbankebene zurückgibt .
Offensichtlich ist dies eher ein simpler Test, um die Auswirkungen zu zeigen. Andere Faktoren wie das Festplattensubsystem, die Einstellungen für das automatische Datenbankwachstum, die anfängliche Größe der Datenbank, andere Prozesse, die auf demselben Server ausgeführt werden, haben ebenfalls Einfluss.
Aus den obigen Tests ergibt sich nahezu kein Unterschied zwischen impliziten und expliziten Transaktionen.
Vielen Dank an @TravisGan, dass Sie dazu beigetragen haben, der Antwort mehr hinzuzufügen.
BEGIN TRAN SELECT ... COMMIT
vs, soSELECT
scheint es einen äußerst geringen Leistungsunterschied zu geben.