PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

очевидно нарушение на изолацията на транзакция в postgresql

Да и Не - както обикновено, зависи. Документацията стриктно казва, че:

С други думи, просто SELECT се различава от SELECT FOR UPDATE/DELETE/UPDATE.

Можете да създадете прост тестов случай, за да наблюдавате това поведение:

Сесия 1

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> DELETE FROM test;
DELETE 10
test=>

Сега влезте в друга сесия 2:

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;

След последната команда SELECT ... FOR UPDATE сесия 1 "виси" и чака нещо ......

Обратно в сесия 1

test=> insert into test select * from generate_series(1,10);
INSERT 0 10
test=> commit;
COMMIT

И сега, когато се върнете към сесия 2, ще видите това:

test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;
 x
---
(0 rows)


test=> select * from test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

Тоест - просто SELECT все още не вижда никакви промени, докато SELECT ... FOR UPDATE вижда, че редовете са изтрити. Но не вижда нови редове, вмъкнати от сесия 1

Всъщност последователност, която виждате е:

  • процес А започва своята транзакция
  • процес A изтрива всичко от таблица T
  • процес Б започва своята транзакция
  • процес B прави опит за избор за актуализиране на един ред в таблица T
  • процес Б "зависва" и чака докато сесия А извърши ангажимент или връщане назад
  • процес A попълва повторно таблица T от входящи данни
  • процес А извършва транзакцията си
  • процес B излиза празен (0 реда – след ангажимент на сесия A) и извиква връщане назад



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Between клауза с колони с низове

  2. Ново в PostgreSQL 12:Генерирани колони

  3. Използването на ActiveRecord и Rails за вмъкване на данни в база данни postgresql получава тази грешка:RuntimeError:ERROR C22003 Minteger o

  4. Обхват за незадължителна връзка has_one със себе си

  5. Синтаксис на заявка за LEFT OUTER JOIN на PostgreSQL