· 6 years ago · Mar 18, 2019, 02:24 AM
1SET search_path = public;
2CREATE TABLE Accounts (
3acctID INTEGER NOT NULL PRIMARY KEY,
4balance INTEGER NOT NULL,
5CONSTRAINT remains_nonnegative CHECK (balance >= 0)
6);
7
8-- data
9DROP TABLE if EXISTS balancea CASCADE;
10DROP TABLE if EXISTS balanceb CASCADE;
11DELETE FROM Accounts;
12INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
13INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
14SELECT * FROM Accounts;
15
16
17--Q1 a
18
19-- TRANSACTION A
20
21
22-- TRANSACTION B
23
24
25-- TRANSACTION A
26
27
28
29-- TRANSACTION B
30
31
32-- TRANSACTION A
33
34
35-- TRANSACTION B
36
37
38-- data
39DROP TABLE if EXISTS balancea CASCADE;
40DROP TABLE if EXISTS balanceb CASCADE;
41DELETE FROM Accounts;
42INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
43INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
44SELECT * FROM Accounts;
45
46--- Q1 b
47
48-- TRANSACTION A
49
50
51-- TRANSACTION B
52
53
54-- TRANSACTION A
55
56
57-- TRANSACTION B
58
59
60-- TRANSACTION A
61
62
63-- TRANSACTION B
64
65
66-- Q2-a
67/*
68Le select de l'étape 3 de la transaction A donne un résultat différent du select de la 1re étape.
691re étape: Account 101 avec 1000 et 202 avec 2000 affichés
703e étape: Seulement 202 avec 2500 affiché
71Ainsi, l’account 101 n’est pas affiché, car la transaction 2 a réduit son solde à 500. Ceci est incohérent avec le premier select.
72*/
73-- data
74DROP TABLE if EXISTS balancea CASCADE;
75DROP TABLE if EXISTS balanceb CASCADE;
76DELETE FROM Accounts;
77INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
78INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
79SELECT * FROM Accounts;
80
81-- Transaction A
82\set AUTOCOMMIT off
83BEGIN;
84SET TRANSACTION
85ISOLATION LEVEL READ COMMITTED;
86--ISOLATION LEVEL REPEATABLE READ;
87SELECT * FROM Accounts
88WHERE balance > 500;
89
90-- Transaction B
91\set AUTCOMMIT off
92BEGIN;
93UPDATE Accounts
94SET balance = balance - 500
95WHERE acctID = 101;
96UPDATE Accounts
97SET balance = balance + 500
98WHERE acctID = 202;
99SELECT * FROM Accounts;
100COMMIT;
101
102-- Transaction A
103SELECT * FROM Accounts
104WHERE balance > 500;
105
106-- Q2-b
107/*
108REPEATABLE READ fait en sorte que le select de l'étape 1 de la transaction A soit cohérent avec celui de l'étape 3.
1091re étape: Account 101 avec 1000, account 202 avec 2000
1102e étape: Account 101 avec 1000, account 202 avec 2000
111La transaction B n'a donc pas influencé le select de la transaction A.
112*/
113-- data
114DROP TABLE if EXISTS balancea CASCADE;
115DROP TABLE if EXISTS balanceb CASCADE;
116DELETE FROM Accounts;
117INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
118INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
119SELECT * FROM Accounts;
120
121-- Transaction A
122\set AUTOCOMMIT off
123BEGIN;
124SET TRANSACTION
125-- ISOLATION LEVEL READ COMMITTED;
126ISOLATION LEVEL REPEATABLE READ;
127SELECT * FROM Accounts
128WHERE balance > 500;
129
130-- Transaction B
131\set AUTCOMMIT off
132BEGIN;
133UPDATE Accounts
134SET balance = balance - 500
135WHERE acctID = 101;
136UPDATE Accounts
137SET balance = balance + 500
138WHERE acctID = 202;
139SELECT * FROM Accounts;
140COMMIT;
141
142-- Transaction A
143SELECT * FROM Accounts
144WHERE balance > 500;
145--- Q2-c
146/*
147Le problème est que même si la transaction B ajoute des données à la table Accounts, les selects de la transaction A
148n'arrive pas à les trouver et à les afficher.
149Transaction B (étape 2, 4) -> Accounts 301 et 302 avec un solde de 3000 insérés
150Transaction A (étape 3, 5) -> Les selects affichent seulement 1 account avec balance > 1000
151La transaction A ne parvient donc pas à sélectionner les insertions de la transaction B.
152*/
153-- data
154DROP TABLE if EXISTS balancea CASCADE;
155DROP TABLE if EXISTS balanceb CASCADE;
156DELETE FROM Accounts;
157INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
158INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
159SELECT * FROM Accounts;
160
161-- Transaction A
162\set AUTCOMMIT off
163BEGIN;
164SET TRANSACTION
165ISOLATION LEVEL REPEATABLE
166READ READ ONLY;
167-- Transaction B
168\set AUTCOMMIT off
169BEGIN;
170INSERT INTO Accounts (acctID,
171balance) VALUES (301,3000);
172
173-- Transaction A
174SELECT * FROM Accounts
175WHERE balance > 1000;
176
177-- Transaction B
178INSERT INTO Accounts (acctID,
179balance) VALUES (302,3000);
180
181-- Transaction A
182SELECT * FROM Accounts
183WHERE balance > 1000;
184COMMIT;
185
186-- Q4- Deadlock
187-- data
188DROP TABLE if EXISTS balancea CASCADE;
189DROP TABLE if EXISTS balanceb CASCADE;
190DELETE FROM Accounts;
191INSERT INTO Accounts (acctID, balance) VALUES (101, 1000);
192INSERT INTO Accounts (acctID, balance) VALUES (202, 2000);
193SELECT * FROM Accounts;
194
195--- Transaction A
196BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
197UPDATE Accounts
198SET balance = balance - 500
199WHERE acctID = 101;
200
201-- Transaction B
202BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
203UPDATE Accounts
204SET balance = balance - 700
205WHERE acctID = 202;
206UPDATE Accounts
207SET balance = balance + 700
208WHERE acctID = 101;
209
210--- Transaction A
211UPDATE Accounts
212SET balance = balance - 300
213WHERE acctID = 202;