You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

113 lines
4.1 KiB

  1. CREATE TABLE bank2 (id serial, username VARCHAR(50), fullname VARCHAR(50), balance numeric, Group_id int);
  2. INSERT INTO bank2 (username, fullname, balance, Group_id) VALUES('jones', 'Alice Jones', 82, 1);
  3. INSERT INTO bank2 (username, fullname, balance, Group_id) VALUES('bitdiddl', 'Ben Bitdiddle', 82, 1);
  4. INSERT INTO bank2 (username, fullname, balance, Group_id) VALUES('mike', 'Michael Dole', 73, 2);
  5. INSERT INTO bank2 (username, fullname, balance, Group_id) VALUES('alyssa', 'Alyssa P. Hacker', 79, 3);
  6. INSERT INTO bank2 (username, fullname, balance, Group_id) VALUES('bbrown', 'Bob Brown', 100, 3);
  7. -- Terminal 1
  8. BEGIN;
  9. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  10. SELECT * from bank2;
  11. -- id | username | fullname | balance | group_id
  12. -- ----+----------+------------------+---------+----------
  13. -- 1 | jones | Alice Jones | 82 | 1
  14. -- 2 | bitdiddl | Ben Bitdiddle | 82 | 1
  15. -- 3 | mike | Michael Dole | 73 | 2
  16. -- 4 | alyssa | Alyssa P. Hacker | 79 | 3
  17. -- 5 | bbrown | Bob Brown | 100 | 3
  18. SELECT * from bank2;
  19. -- id | username | fullname | balance | group_id
  20. -- ----+----------+------------------+---------+----------
  21. -- 1 | jones | Alice Jones | 82 | 1
  22. -- 2 | bitdiddl | Ben Bitdiddle | 82 | 1
  23. -- 3 | mike | Michael Dole | 73 | 2
  24. -- 4 | alyssa | Alyssa P. Hacker | 79 | 3
  25. -- 5 | bbrown | Bob Brown | 100 | 3
  26. -- Nothing changed after the change in second terminal
  27. -- Terminal 2
  28. BEGIN;
  29. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  30. UPDATE bank2 SET username='ajones' WHERE fullname='Alice Jones';
  31. SELECT * from bank2;
  32. -- id | username | fullname | balance | group_id
  33. -- ----+----------+------------------+---------+----------
  34. -- 2 | bitdiddl | Ben Bitdiddle | 82 | 1
  35. -- 3 | mike | Michael Dole | 73 | 2
  36. -- 4 | alyssa | Alyssa P. Hacker | 79 | 3
  37. -- 5 | bbrown | Bob Brown | 100 | 3
  38. -- 1 | ajones | Alice Jones | 82 | 1
  39. -- The results are different because isolation level read commited allows to read only commited changes
  40. COMMIT;
  41. -- After commitment, they are the same
  42. -- Term 1
  43. UPDATE bank2 SET balance=balance+10 WHERE id=1;
  44. -- Term 2
  45. UPDATE bank2 SET balance=balance+20 WHERE id=1;
  46. -- it waits the commitment from term 1
  47. -- Term 1
  48. COMMIT;
  49. -- Term 2
  50. ROLLBACK;
  51. -- Repetable read
  52. UPDATE bank2 SET username='jones' WHERE fullname='Alice Jones';
  53. -- Term 1
  54. BEGIN;
  55. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  56. SELECT * from bank2;
  57. SELECT * from bank2;
  58. SELECT * from bank2;
  59. UPDATE bank2 SET balance=balance+10 WHERE id=1;
  60. COMMIT;
  61. -- Term 2
  62. BEGIN;
  63. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  64. UPDATE bank2 SET username='ajones' WHERE fullname='Alice Jones';
  65. COMMIT;
  66. BEGIN;
  67. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  68. UPDATE bank2 SET balance=balance+20 WHERE id=1;
  69. -- Even after COMMIT on term 2, the data doesn't change on Term 1 because of the transaction isolation repetable read
  70. -- Also after the balance change on the second term this error shows up:ERROR: could not serialize access due to concurrent update
  71. -- PART 2
  72. -- TERM 1
  73. BEGIN;
  74. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  75. SELECT * from bank2 WHERE Group_id=2;
  76. SELECT * from bank2 WHERE Group_id=2;
  77. UPDATE bank2 SET balance=balance+15 WHERE Group_id=2;
  78. -- Mike shows up
  79. -- TERM 2
  80. BEGIN;
  81. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  82. UPDATE bank2 SET Group_id=2 WHERE username='bbrown';
  83. -- BOB's balance hasn't change because when READ COMMITTED is set, it's impossible to view changes in other running transaction, so only balance of mike changed
  84. -- REPEATABLE
  85. UPDATE bank2 SET Group_id=3 WHERE username='bbrown';
  86. -- TERM 1
  87. BEGIN;
  88. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  89. SELECT * from bank2 WHERE Group_id=2;
  90. SELECT * from bank2 WHERE Group_id=2;
  91. UPDATE bank2 SET balance=balance+15 WHERE Group_id=2;
  92. -- Mike shows up
  93. -- TERM 2
  94. BEGIN;
  95. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  96. UPDATE bank2 SET Group_id=2 WHERE username='bbrown';
  97. -- THE same result