Der Transaktionssimulator

Werbung
Der Transaktionssimulator
 Dr. Arno Schmidhauser
Letzte Revision: Oktober 2004
Email: [email protected]
Webseite: http://www.sws.bfh.ch/~schmd/db
Transaktionssimulator
2
Inhalt
1
2
3
4
5
6
7
8
9
10
11
12
13
Zweck ................................................................................... 3
Transaktionsmuster ................................................................. 3
Isolationsgrade ....................................................................... 4
Ablauf eines Simulationsthreads ................................................ 5
Thread-Modelle ....................................................................... 7
Datentabelle für die Simulation ................................................. 8
Property-File für die Simulation ................................................. 9
Start der Simulation ................................................................ 9
Vordefinierte Thread-Modelle ...................................................10
Simulationsresultate in der Datenbank ......................................11
Aufgaben ..............................................................................12
Einige Simulationsresultate......................................................12
Anwendungsbeispiel Bank-Konto ..............................................19
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
1
3
Zweck
Der Transaktionssimulator soll die Performance und das Auftreten möglicher
Inkonsistenzen simulieren, wenn viele Transaktionen gleichzeitig auf eine
Datenbank zugreifen. Der Simulator startet für eine bestimmte Zeit mehrere
Threads, von denen jeder nach bestimmten Vorgaben Transaktionen
durchführt. Ein Simulations-Thread könnten beispielsweise ein Session Bean
in einer J2EE Umgebung entsprechen, oder auch einer alleinstehenden
Client-Applikation. Ein Thread folgt einem Transaktionmuster (Lesen, LesenSchreiben, Einfügen usw.), einem bestimmten Isolationsgrad und einem
bestimmten zeitlichen Ablauf (Wartezeiten zwischen den DatenbankZugriffen).
Folgende Resultate werden nach der Simulation global angezeigt:
ƒ
ƒ
ƒ
Anzahl durchgeführte Transaktionen aller Threads
Durchschnittlicher Zeitbedarf für eine Transaktion aller Threads
Anzahl produzierter Lost Updates in der Datenbank
Folgende Resultate werden nach der Simulation pro Thread angezeigt:
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
2
Anzahl durchgeführte Transaktionen
Durchschnittlicher Zeitbedarf für eine Transaktion
Anzahl aufgetretener Deadlocks
Durchschnittliche Zeit von Transaktionsbeginn bis zum Rollback des
Deadlocks
Anzahl gelesene Phantomzeilen
Anzahl Rollbacks beim optimistischen Zeitstempelverfahren
Transaktionsmuster
Jeder Thread führt seine Transaktionen nach einem bestimmten Muster
durch. Folgende Muster können für einen Thread gewählt werden:
R
Reine Lesetransaktion. Ein bestimmter Prozentsatz der Datensätze
wird gelesen, anschliessend ein Commit abgesetzt.
RR
Reine Lesetransaktion. Ein bestimmter Prozentsatz der Datensätze
wird gelesen, danach eine kurze Zeit gewartet. Die Wartezeit simuliert
eine applikationsspezifsche Berechnung oder Business Logic.
Anschliessend werden diesselben Daten nochmals gelesen, damit
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
RU
I
D
4
nochmals eine (-andere-) applikationsspezifsche Berechnung simuliert
werden kann.
Lese- und Änderungstransaktion. Ein bestimmter Prozentsatz der
Datensätze wird zuerst gelesen, anschliessend wird eine kurze Zeit
gewartet, um bestimmte Berechnungen/Auswertungen zu simulieren.
Danach wird ein Teil der gelesenen Daten geändert und in die
Datenbank zurückgeschrieben.
Einfügetransaktion. Pro Transaktion wird eine bestimmte Anzahl neuer
Datensätze eingefügt.
Löschtransaktion. Pro Transaktion wird ein bestimmter Prozentsatz
der Datensätze gelöscht.
Jeder Thread folgt einem bestimmten Transaktionsmuster. Zusätzlich zum
Muster wird für die Transaktionen eines Threads ein bestimmter
Isolationsgrad eingestellt.
3
Isolationsgrade
Für jedes Transaktionsmuster können folgende Isolationsgrade (Isolation
Levels) eingestellt werden. Die Isolationsgrade 0, 1, 2 und 3 sind Teil des
SQL Standards. Die Isolationsgrade 4, 5, und 6 wurden speziell für diesen
Simulator definiert. Viele Datenbanksysteme besitzen entsprechende SQLBefehle.
0
1
2
3
4
5
6
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
SHARED TABLE LOCK
EXCLUSIVE TABLE LOCK
OPTIMISTIC LOCKING
Der vorliegende Simulator wurde gegen eine Sybase SQL Anywhere 9.0
Datenbank geprüft. Die Isolationsgrade sind wie folgt implementiert:
0
1
Dirty Read auf den aktuellen Daten. Änderungen einer anderen
Transaktion (insbesondere unbestätigte und noch gesperrte) können
sofort und ohne Behinderung gelesen werden.
Kurze Lesesperrre auf den zu lesenden Daten. Für die zu lesenden
Daten wird eine Lesesperre angefordert. Damit wird verhindert, dass
Änderungen einer anderen Transaktion, die noch nicht committet hat,
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
2
3
4
5
6
5
gelesen werden können. Die Lesesperre wird aber sofort nach dem
Lesen wieder freigegeben.
Setzen einer Leseperre auf alle gelesenen Datensätze. Datensätze, die
gelesen werden, um die Auswahlbedingung zu prüfen, werden mit
einer Lesesperre belegt. Lesesperren auf Datensätzen, die der
Auswahlbedingung nicht genügen, werden sofort wieder
zurückgegeben.
Es wird mit Shared Range Locks gearbeitet. Es werden also alle
Datensätze gesperrt, welche in den von der Auswahlbedingung
definierten Wertebereich fallen. Range Locks sind so implementiert,
dass das Einfügen neuer Datensätze in den gesperrten Wertebereich
nicht möglich ist.
Die Tabelle als Ganzes wird mit einer Lesesperre versehen. Damit sind
keinerlei Einfügungen, Löschungen oder Änderungen innerhalb der
Tabelle mehr möglich. Jedoch kann die Tabelle von anderen
Transaktionen ohne Einschränkungen gelesen werden.
Die Tabelle als Ganzes wird mit einer exklusiven Sperre versehen.
Damit ist jeder anderen Transaktion ein Zugriff irgendwelcher Art
verwehrt. Aufgrund der Implementation von Sybase sind nicht einmal
mehr Dirty Reads möglich.
Pro Datensatz wird ein fortlaufender Zähler geführt. Bei jeder
Änderung wird dieser Zähler inkrementiert (z.B. durch einen Trigger
oder die Applikation selbst). Beim Lesen eines Datensatzes (mit READ
UNCOMMITTED) wird auch der aktuelle Zählerwert gelesen. Da keine
Lesesperre gesetzt wird, ist der Datensatz sofort frei für andere
Transaktionen. Beim Zurückschreiben eines Datensatzes wird geprüft,
ob der gelesene Zählerwert noch mit demjenigen des Datensatzes in
der Datenbank übereinstimmt. Wenn nicht, führt die Applikation ein
Rollback durch. Das Zurückschreiben der Daten unter gleichzeitiger
Prüfung des Zählerwertes ist in SQL ganz einfach:
update dataTable set data = wert, ...
where zaehlerAttribut = zaehlerAppl and ...
4
Ablauf eines Simulationsthreads
Die Simulation besteht aus mehreren, parallel laufenden Threads. Jeder
Thread führt anhand seines Transaktionsmusters, laufend Transaktionen
gegen die Datenbank durch. Jeder Thread hat neben dem
Transaktionsmuster zusätzlich Vorgaben für den Isolationsgrad, die Anzahl
zu lesender oder schreibender Datensätze, die Wartezeiten usw. Alle
Angaben für einen Thread bilden zusammen ein Thread-Modell. Jedes
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
6
Oktober 2004
Commit
Warten
Commit
Warten
Warten
Daten lesen
Commit
Warten
Commit
Warten
Warten
Warten
Warten
Commit
Daten Lesen
Warten
Warten
I
D
Warten
Daten lesen
RU
Gelesene
Daten ändern
Warten
Daten lesen
RR
Daten Einfügen
Setzen
Isolationsgrad
Setzen
Isolationsgrad
Setzen
Isolationsgrad
Setzen
Isolationsgrad
Setzen
Isolationsgrad
Start
Start
Start
Start
Start
Thread-Modell ist durch Angaben in einem Property File definiert. Einige
vordefinierte Thread-Modelle sind in Kapitel 5 beschrieben. Der zeitliche
Ablauf der verschiedenen Thread-Modelle, bezogen auf das
Transaktionsmuster (R, RR, RU, I, D), ist wie folgt gestaltet:
R
Arno Schmidhauser
SWS
Transaktionssimulator
7
Die mittleren Werte für die Wartezeiten werden im Thread-Modell vorgegeben. Bei jedem Wartevorgang wird die mittlere Wartezeit aber mit einem
zufälligen Faktor von 0 bis 2 multipliziert. Damit ist ein gutes statistisches
Verhalten gewährleistet.
5
Thread-Modelle
Jedes Thread-Modell ist in einem Property-File definiert, das den Namen
Modell.props trägt. Bei Start der Simulation können die Namen mehrerer
Modelle angegeben werden. Es werden dann soviele Threads gestartet, wie
Modelle angegeben sind. Dasselbe Modell kann mehrmals angegeben
werden. Einige vordefinierte Thread-Modell sind im letzten Kapitel
beschrieben. Der Name des Modells besteht in diesen Beispielen aus dem
Transaktionsmuster und dem Isolationsgrad. Folgende Parameter können
angegeben werden:
Name
Werte
Beschreibung
THR_NAME
TRA_TYPE
ISO_LEVEL
deskriptive Beschreibung des Modells .
Transaktionsmodell
Kurzform für die Isolationsgrade 0, 1,
2, 3, 4, 5 oder 6.
SEL_PRCNT
String
R RU RR D I
UNC COM REP
SER
T_S T_X TST
Zahl [0..100]
UPD_PRCNT
Zahl [0..100]
DEL_PRCNT
Zahl [0..100]
INS_NUMBER
Zahl > 0
RR_DELAY
Zahl > 0
RU_DELAY
Zahl > 0
CMT_DELAY
Zahl > 0
LOP_DELAY
Zahl > 0
Oktober 2004
Anteil der Datensätze in %, die aus
der Tabelle gelesen werden sollen.
Anteil der gelesenen Datensätze in %,
die modifiziert werden sollen.
Anteil der Datensätze in %, die
gelöscht werden sollen.
Anzahl Datensätze, die pro
Transaktion eingefügt werden sollen.
Mittlere Wartezeit zwischen den zwei
select-Befehlen (msec).
Mittlere Wartezeit zwischen dem
select- und dem ersten update-Befehl
(msec).
Mittlere Wartezeit vor dem CommitBefehl (msec).
Mittlere Wartezeit nach dem Commit
und vor dem Eintritt in den nächsten
Schlaufendurchgang (msec).
Arno Schmidhauser
Verwendung
in Transaktionsmuster
Alle
Alle
R, RR, RU
RU
D
I
RR
RU
Alle
Alle
SWS
Transaktionssimulator
6
8
Datentabelle für die Simulation
Die Testtabelle TrxTable, auf der alle Transaktionen operieren, hat folgende
Attribute:
name
pkey
searchKey
typ
numeric(10,0)
autoincrement
double
data
int
tranCount
int
Beschreibung
Primärschlüssel. Wir in der Applikation für den
Update benötigt.
Nach diesem Attribut wird beim Lesen gesucht.
Die Werte sind zufällig zwischen 0 und 100
verteilt. Auf diesem Feld besteht ein Index.
Dieses Feld wird gelesen und in nachfolgenden
Update-Befehlen jeweils um 1 inkrementiert.
Dieses Attribut wird unmittelbar bei jedem
Update-Befehl um 1 inkrementiert.
Bemerkungen
ƒ
Sollen beispielsweise 10% der Datensätze gelesen werden, sucht die
Simulation einen zufälligen Startwert für searchkey zwischen 0 und 90.
Ausgehend von diesem Startwert werden die nächsten 10% gelesen.
ƒ
Die Differenz zwischen data und tranCount entspricht der Anzahl LostUpdates auf diesem Datensatz. Die Simulation nimmt nur eine einzige Art
Änderung auf dem Wert von data vor: Der Wert wird in der Applikation
um 1 erhöht und anschliessend zurückgeschrieben. Der Wert von
tranCount wird im Update-Befehl um 1 erhöht (wenn der Datensatz also
bereits mit einer exklusiven Sperre belegt ist).
ƒ
Der Wert von tranCount kann bei Isolationgrad 6 benützt werden, um
festzustellen, ob ein Datensatz zwischen dem Lesen im select-Befehl und
den Schreiben im Update-Befehl geändert wurde. Der Wert von tranCount
wird durch die Simulation im update-Befehl jeweils beim Zurückschreiben
um 1 erhöht.
ƒ
Standardmässig wird die Testtabelle mit 100 Datensätze initialisiert.
Wesentlich mehr oder weniger Datensätze erhöhen oder erniedrigen die
Wahrscheinlichkeit für Deadlocks, Phantoms, Lost Updates, Optimistic
Rollbacks in nicht-linearer Weise: Um didaktisch anschauliche Resultate
zu demonstrieren, müssen entsprechende Tests gefahren werden.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
7
9
Property-File für die Simulation
Die Simulation als Ganzes benötigt verschiedene Parameter. Diese sind im
Property File Simulation.props festgelegt. Proprietäre Datenbank-Befehle,
welche für die Isolationsgrade 4 und 5 benötigt werden, sowie die JDBCTreiberklasse sind ebenfalls in diesem Property File definiert.
Name
Wertbeispiel
Beschreibung
DB_CONURL
DB_USER
DB_PASSWD
DB_RECONNECT
jdbc:sybase:Tds:localhost:2638
?ServiceName=asademo
dba
sql
0
DB_NUMRECORDS
OUT_CLRSTATS
100
1
OUT_INTERVAL
PROD_DRIVERCLASS
PROD_LOCKTABLE_S
10000
com.sybase.jdbc2.jdbc.SybDriver
LOCK TABLE TrxTable
IN SHARE MODE
LOCK TABLE TrxTable
IN EXCLUSIVE MODE
URL für den JDBC
Verbindungsaufbau
Datenbankbenutzer
Passwort
0=Verbindungsaufbau einmal
pro Thread, vor dessen Start.
1=Verbindungsaufbau vor
jeder Transaktion
Initiale Anzahl Datensätze
Statistik nach jeder Simulation
löschen (1) oder Beibehalten
(0)
Laufzeit der Simulation (msec)
JDBC-Treiberklasse
Lesesperre auf Tabelle
PROD_LOCKTABLE_X
8
Exklusive Tabellensperre
Start der Simulation
Der CLASSPATH muss auf die Datei jconn2.jar von Sybase jConnect zeigen.
Starten der Simulation mit:
java Simulation Simulation.props
Anschliessend kann eine Anzahl Thread-Modelle eingegeben werden, zum
Beispiel:
Enter Thread Modells > RR2 RU1 RU1
Die Simulation läuft während der vordefinierten Zeit gemäss
Simulation.props . Anschliessend können neue Thread-Modelle eingegen
werden.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
9
10
Vordefinierte Thread-Modelle
Folgende Property-Files enthalten vordefinierte Thread-Modelle
R0.props
R1.props
RU0.props
R01.props
RU2.props
RU3.props
RU4.props
RU5.props
RU6.props
RR0.props
RR1.props
RR2.props
RR3.props
RR4.props
RR5.props
I0.props
I3.props
I5.props
D0.props
D3.props
D5.props
Der Filename setzt sich aus dem Transaktionstyp und dem verwendeten
Isolationsgrad des Thread-Modelles zusammen.
Beispiel RR2.props
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
=
=
=
=
=
=
=
RR 2
RR
REP
20
100
0
20
Beispiel RU1.props
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
Oktober 2004
=
=
=
=
=
=
=
=
RU 1
RU
COM
10
40
100
0
20
Arno Schmidhauser
SWS
Transaktionssimulator
11
10 Simulationsresultate in der Datenbank
Das Simulationsprogramm schreibt neben der Ausgabe auf Konsole alle
Resultate zurück in die Datenbank, in die Tabellen Simulation und Run.
Ausserdem existiert eine View SimulationRuns über diesen beiden Tabellen.
Von diesen Tabellen können die Resultate beispielsweise in ein Grafik- oder
Tabellenkalkulationsprogramm übernommen werden. Bei Sybase Adaptive
Server SQL kann aus Excel heraus direkt eine Datenquelle angezapft werden.
Die Tabelle Simulation enthält Angaben über die Simulation als Ganzes, wie
Zeitstempel und Lost Updates. Die Taballe Run enthält Angaben zu den
einzelnen Threads einer Simulation. Die View SimulationRuns ist ein natural
join über beide Tabellen. Beispielinhalt von SimulationRuns
Im Excelsheet SimulationsResultate.xls werden die Resultate grafisch
dargestellt. Die Datenquelle bezieht sich auf die installierte Demodatenbank
von Sybase ASA, kann aber leicht neu definiert werden für andere
Einstellungen oder Datenbanksysteme.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
11
12
Aufgaben
1. Bei welchem minimalen Isolationsgrad kann das Transaktionsmuster RU in
mehreren Threads nebeneinander ohne Deadlocks ablaufen?
2. Welcher Isolationsgrad ist notwendig, damit das Transaktionsmuster RU in
mehreren Threads nebeneinander ohne Lost Updates ablaufen kann?
3. Bei welchem Isolationsgrad kann das Transaktionsmuster RR in mehreren
Threads nebeneinander ablaufen, ohne dass Phantome entstehen?
4. Für welchen Isolationsgrad (3 oder 5) ergeben sich Performance-Vorteile,
wenn zwei Threads mit Transaktionsmuster RR und ein Thread mit dem
Transaktionsmuster I gestartet wird?
5. Mit welchen Isolationsgraden können Deadlocks in RU Transaktionen
vermieden werden?
6. Mit welchen Isolationsgraden können Lost Updates in RU Transaktionen
vermieden werden?
7. Welche Isolationsgrade verhindern Phantome in RR Transaktionen?
8. Welche Vorteile hat der Isolationsgrad 6?
9. Wie ist das Verhalten bezüglich gesamtem Durchsatz an Transaktionen für
die verschiedenen Thread-Modelle. Starten Sie beispielsweise 1 bis 10
Threads RU1 parallel, oder 1 bis 10 Threads RU5 parallel.
12 Einige Simulationsresultate
Im Folgenden werden einige Simulationsresultate vorgestellt. Die ThreadNamen setzen sich aus dem Transaktionstyp (RR, RU, I, D) und dem
Isolationsgrad (0-6 entsprechend READ_UNCOMMITTED, READ_COMMITTED,
REPEATABLE_READ, SERIALIZABLE, SHARED TABLE LOCK, EXCLUSIVE
TABLE LOCK, OPTIMISTIC) zusammen.
Die Simulationsdauer für alle Threads ist 10 Sekunden. Die Y-Achse für das
Diagramm 'Einzelne Threads' ist 'Anzahl'. Die Y-Achse für das Diagramm
'AlleTransaktionen' ist einerseits 'Anzahl', andererseits 'Millisekunden'.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
13
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 0
RU 0
RU 0
RU 0
RU 0
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU0 ist nur akzeptabel, wenn Lost Updates aus applikatorischer Sicht keine Probleme bieten.
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 1
RU 1
RU 1
RU 1
RU 1
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU1 ist nur akzeptabel, wenn Lost Updates aus applikatorischer Sicht keine Probleme bieten.
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 2
RU 2
RU 2
RU 2
RU 2
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU2 ist sicher bezüglich Inkonsistenzen in der Datenbank (Lost Updates), produziert aber
öfters Deadlocks. Wenn diese automatisch behoben werden können (Retry), vermindern sie
lediglich den Gesamtdurchsatz an Transaktionen.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
14
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 3
RU 3
RU 3
RU 3
RU 3
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU3 unterscheidet sich kaum von RU2. RU3 kann gegenüber RU2 verhindern, dass während
dem Lesen und Ändern von Datensätzen eine andere Transaktion Datensätze einfügt, welche
die erste Transaktion eigentlich auch gerade hätte ändern wollen.
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 4
RU 4
RU 4
RU 4
RU 4
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
Bei RU4 (Shared Table Lock) führt der Deadlock-Anteil zu einer sehr schwachen
Performance.
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 5
RU 5
RU 5
RU 5
RU 5
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU5 ergibt einen sehr schlechten Gesamtdurchsatz. Jede einzelne Transaktion läuft exklusiv
ab und blockiert jede andere vollständig.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
15
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 6
RU 6
RU 6
RU 6
RU 6
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
RU6 ergibt einen guten Durchsatz (Weniger als RU1, aber mehr als RU2 und RU5), bei
gleichzeitiger Sicherheit, keine dauerhaften Inkosistenzen (Lost Updates) in der Datenbank
zu produzieren.
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
80
60
40
20
0
numOptRlbks
numPhn
numDlks
RU 3
RR 4
RR 4
RR 4
RR 4
numTrx
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
5 Lesetransaktionen RR4 schliessen die Änderungstransaktionen RU3 sehr effizient vom
Zugriff aus (Livelock)!
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
numOptRlbks
100
80
numDlks
numPhn
numTrx
RU 3
RR 3
RR 3
RR 3
RR 3
60
40
20
0
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
5 Lesetransaktionen RR3 lassen die Änderungstransaktionen RU3 noch weitgehend auf die
Datenbank zu. Der Gesamtdurchsatz ist sehr hoch (RR3 lesen 10% der Daten).
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
16
Einzelne Threads
200
180
160
Alle Transaktionen
140
120
100
numOptRlbks
numPhn
numDlks
80
60
numTrx
D 0
I 0
RR 3
RR 2
RR 1
RR 0
40
20
0
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
Sobald Einfüge- und Löschtransaktionen ins Spiel kommen, ergeben sich Phantom-Probleme
bei RR-Lesetransaktionen. RR0 bis RR2 leiden an Phantomen. Erst bei RR3 verschwinden
diese gemäss Theorie ordnungsgemäss. RR0 bis RR2 sind jedoch auch leicht performanter
(RR0 – RR3 lesen 20% aller Datensätze).
Einzelne Threads
200
180
Alle Transaktionen
160
140
numOptRlbks
numPhn
120
100
numDlks
numTrx
80
60
40
20
D 0
I 0
RU 2
RR 4
RR 4
RR 4
RR 4
0
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
Die Implementation von SERIALIZABLE mit einem Shared Table Lock (RR4) verdrängt
Änderungs-, Einfüge- und Löschtransaktionen.
Einzelne Threads
200
180
Alle Transaktionen
160
140
numOptRlbks
120
numPhn
numDlks
numTrx
100
80
60
40
20
D 0
I 0
RU 2
RR 3
RR 3
RR 3
RR 3
0
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
Die Implementation von SERIALIZABLE mit Range Locks (RR3) bringt wesentliche Vorteile:
Änderungs-, Einfüge- und Löschtransaktionen können gleichberechtigt agieren (RR3 lesen
20% der gesamten Daten).
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
17
Einzelne Threads
200
180
Alle Transaktionen
160
140
numOptRlbks
numPhn
numDlks
numTrx
120
100
80
60
40
20
I 0
D 0
RU 6
RU 5
RU 4
RU 3
RU 2
RU 1
RR 5
RU 0
RR 4
RR 3
RR 2
RR 1
RR 0
0
1000
900
800
700
600
500
400
300
200
100
0
SummeTrx
avgTrxTime
LostUpdates
Bunter Mix verschiedenster Transaktionen. RR0 – RR5 lesen 20% der Daten. RU0 bis RU6
lesen 10% der Daten und verändern 40% der gelesenen Daten. Transaktionen, die am
meisten Resourcen beanspruchen, werden selbst am meisten von der Datenbank
ausgeschlossen (RR4, RR5, RU5).
Zu beachten ist noch, dass der Gesamtdurchsatz von Transaktionen mit der Anzahl Threads
wächst. Weil gesamthaft 15 Threads laufen, ist der Gesamtdurchsatz höher also bei den
anderen Diagrammen weiter oben.
Oktober 2004
Arno Schmidhauser
SWS
Transaktionssimulator
18
Es gelten folgende Parametersätze für die Threadmodelle in den obigen Beispielen (ausser
wenn anders beschriftet unter der Grafik)
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
Oktober 2004
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
RU 0
RU
UNC
10
40
100
0
20
RU 3
RU
SER
10
40
100
0
20
RU 6
RU
TST
10
40
100
0
20
RR 2
RR
REP
20
100
0
20
RR 5
RR
T_X
20
100
0
20
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
RU 1
RU
COM
10
40
100
0
20
RU 4
RU
T_S
10
40
100
0
20
RR 0
RR
UNC
20
100
0
20
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
UPD_PRCNT
RU_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
RU 2
RU
REP
10
40
100
0
20
RU 5
RU
T_X
10
40
100
0
20
RR 1
RR
COM
20
100
0
20
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
INS_NUMBER
CMT_DELAY
LOP_DELAY
=
=
=
=
=
=
=
=
=
=
=
=
=
RR 3
RR
SER
20
100
0
20
I 0
I
UNC
1
100
20
THR_NAME
TRA_TYPE
ISO_LEVEL
SEL_PRCNT
RR_DELAY
CMT_DELAY
LOP_DELAY
THR_NAME
TRA_TYPE
ISO_LEVEL
DEL_PRCNT
CMT_DELAY
LOP_DELAY
=
=
=
=
=
=
=
=
=
=
=
=
=
RR 4
RR
T_S
20
100
0
20
D 0
D
UNC
1
100
20
Arno Schmidhauser
SWS
Transaktionssimulator
19
13 Anwendungsbeispiel Bank-Konto
Beispiel RU-Transaktion: Kontonstand lesen und prüfen, dann Betrag
abheben oder einzahlen. Isolationsgrad REPEATABLE READ oder OPTIMISTIC
LOCKING ist ausreichend. READ COMMITTED ist sicher nicht ausreichend,
weil Lost Updates nicht akzeptabel wären. Was soll im Fall eines Deadlocks
passieren? Kunde informieren oder Transaktion auf die Gefahr eines
inkonsistenten Kontostandes hin trotzdem durchführen? Sollen Deadlocks mit
einem EXCLUSIVE TABLE LOCK verhindert werden? Ist die Performance noch
akzeptabel?
Beispiel einer RR-Transaktion: Erstes Lesen um Kontosaldo zu bilden.
Zweites Lesen für Detailauszug, jeder Datensatz einzeln. Beide Abfrage
müssen gegenseitig konsistente Resultate ergeben bezüglich Saldo.
Kombination von R und I Transaktion: Wenn das Bankkonto nicht als
einzelner Datensatz, sonder journalartig geführt wird, das heisst jedes
Abheben oder Einzahlen ein Journaleintrag ist, ergeben sich neue Fragen:
Reicht REPEATABLE READ noch aus? Ja, wenn das Bankkonto keine Limite
für das Überziehen hat. Nein, wenn es eine Limite gibt! Wenn es eine Limite
gibt, ist SERIALIZABLE notwendig!
Oktober 2004
Arno Schmidhauser
SWS
Herunterladen