-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy path03_TransactionRequest.py
executable file
·88 lines (76 loc) · 2.42 KB
/
03_TransactionRequest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env python3
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from tables import Animal
# Lien avec la base de données
engine = create_engine('sqlite:///database.db')
# Création de plusieurs sessions
Session = sessionmaker(bind=engine)
session1 = Session() # essai 1 de la transaction
session2 = Session() # essai 2 avec erreur
session3 = Session() # essai 3 avec erreur + rollback
session4 = Session() # essai 4 avec erreur + rollback (en plus tendu)
lecture = Session() # seulement pour vérification
# Préparation de plusieurs objets
# sachant que le Zèbre a déjà été enregistré !
lion = Animal(name='Lion')
giraffe = Animal(name='Girafe')
monkey = Animal(name='Singe')
elephant = Animal(name='Éléphant')
snake = Animal(name='Serpent')
def display_count(session_name):
total = lecture.query(Animal).count()
print("Avant session %s : %s" % (str(session_name), total))
print("\t%s" % [x.name for x in lecture.query(Animal).all()])
# Transaction - version 1: à la manière facile
# begin_nested() créer un point de sauvegarde pour éventuellement
# revenir en arrière
display_count(1)
with session1.begin_nested():
session1.add(lion)
session1.add(snake)
# version 1: vérification
assert lecture.query(Animal).count() == 3 # Avec le zèbre
# Transaction - version 2: avec erreur (et donc try/except)
# SI une erreur survient => un rollback est effectué
display_count(2)
session2.begin_nested()
try:
session2.add(giraffe)
raise
session2.add(monkey)
session2.commit()
except:
# no rollback
pass
# version 2 : vérification
assert lecture.query(Animal).count() == 3
# Transaction - version 3: la même que la 2, avec erreur (en plus tendu)
display_count(3)
session3.begin_nested()
session3.add(elephant) # l'éléphant arrive !
session3.commit()
try:
session3.add(giraffe)
raise
session3.add(monkey)
session3.commit()
except:
session3.rollback()
# version 3 : vérification
# L'éléphant est resté car il y a eu un commit !
assert lecture.query(Animal).count() == 4
# Transaction - version 4: la même que la 3, plus compliqué
display_count(4)
session4.begin_nested()
try:
session4.add(giraffe)
session4.commit()
raise
session4.add(monkey)
session4.commit()
except:
session4.rollback()
# version 4 : vérification
# Tout le bloc du try est annulé ! Même avec un commit !
assert lecture.query(Animal).count() == 4