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

Използване на двуфазови ангажименти на postgres

Мисля, че не сте разбрали PREPARE TRANSACTION .

Това извлечение приключва работата по транзакцията, т.е. трябва да бъде издадено след цялата работа е свършена. Идеята е PREPARE TRANSACTION прави всичко, което потенциално може да се провали по време на ангажимент, с изключение на самия комит. Това е да се гарантира, че последващ COMMIT PREPARED не може да се провали.

Идеята е, че обработката е както следва:

  • Стартирайте START TRANSACTION на цялата база данни, участваща в разпределената транзакция.

  • Върши цялата работа. Ако има грешки, ROLLBACK всички транзакции.

  • Стартирайте PREPARE TRANSACTION във всички бази данни. Ако това някъде се провали, стартирайте ROLLBACK PREPARED в тези бази данни, където транзакцията вече е била подготвена и ROLLBACK на останалите.

  • Веднъж PREPARE TRANSACTION е успял навсякъде, стартирайте COMMIT PREPARED във всички включени бази данни.

По този начин можете да гарантирате „всичко или нищо“ в няколко бази данни.

Един важен компонент тук, който не съм споменал, е мениджърът на разпределени транзакции . Това е част от софтуера, който постоянно запаметява къде в горния алгоритъм е обработката в момента, така че да може да изчисти или да продължи извършването след срив.

Без мениджър на разпределени транзакции, двуфазното ангажиране не струва много и всъщност е опасно:ако транзакциите блокират в „подготвената“ фаза, но все още не са ангажирани, те ще продължат да държат заключвания и (в случай на PostgreSQL) блокира работата на автоматичното вакуумиране дори чрез рестартиране на сървър , тъй като такива транзакции трябва да са постоянни.

Това е трудно да се разбере правилно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да задам часова зона на postgresql jdbc връзка, създадена от flyway?

  2. Postgresql се опитва да използва формат за изпълнение във функция, но получава грешка в колоната, която не е намерена, когато дава формат на низ в обединяване

  3. Постоянна грешка при изчакване H12 за всички заявки, които изпълняват заявка към база данни

  4. PostgreSQL - ГРУПИРАНЕ ПО стойности на клеймо за време?

  5. Postgres:вземете мин., макс., обобщени стойности в един избор