Changes between Initial Version and Version 1 of dba_transactions


Ignore:
Timestamp:
06/06/25 19:31:52 (7 days ago)
Author:
211012
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • dba_transactions

    v1 v1  
     1= Трансакции, конкурентно извршување и заклучување на ресурсите
     2
     3== Трансакции
     4
     5Трансакциите се фунфаментален концепт на системите за управување со бази на податоци, што обезбедува атомичност, конзистентост и изолација на состојбата во базата, додека се извршуваат повеќе операции групирани во единствена логичка целина. Ваквата логичка целина (трансакција) или се извршува во целост или не се извршува воопшто.
     6
     7Во PostgreSQL клучните зборови кои се користат во контекст на трансакции за започнување, потврдување и поништување на трансакциите се `BEGIN`, `COMMIT` и `ROLLBACK` соодветно. Покрај ова, PostgreSQL поддржува и парцијално зачувување на состојбата во рамки на трансакцијата со `SAVEPOINT`.
     8
     9Во однос на „типови“ на трансакции, односно нивоа на изолираност нa трансакции, PostgreSQL поддржува четири, и тоа:
     10- READ UNCOMMITED
     11Ова е најниското ниво на изолација и нешто што практично излегува од концептот на трансакција бидејќи до некој степен ја нарушува конзистентноста во рамки на една трансакција. Имено, ова ниво на изолација дава можност во рамки на трансакцијта да се има пристап до непотврдени промени од други трансакции. Па така, доколку во една сесија се изврши следниот код:
     12
     13{{{#!sql
     14BEGIN TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
     15SELECT balance FROM accounts WHERE name = 'User Test'; -- Резултат: 500
     16
     17}}}
     18
     19Притоа, во друга сесија се изврши следниот код:
     20{{{#!sql
     21BEGIN;
     22UPDATE accounts SET balance = balance + 500 WHERE name = 'User Test';
     23
     24-- сѐ уште не се потврдува трансакцијата
     25}}}
     26
     27Доколку се вратиме во првата сесија и го извршиме повторно истиот SELECT, резултатот овој пат ќе биде 1000.
     28
     29- READ COMMITED
     30Ова е стандардното однесување и ниво на изолација на трансакциите кое го добиваме без дополнителни клучни зборови при започнување на трансакција. Промените направени во рамки на трансакциите се достапни по нивно потврдување
     31
     32- REPEATABLE READ
     33Ова ниво на изолација обезбедува практично замрзнување на состојбата на базата во моментот на започнување на трансакцијата. Доколку по започнување на трансакција со ниво на изолација `REPEATABLE READ`, во друга сесија се започне и потврди друга трансакција, резултатот од истата нема да биде видлив во рамки на трансакцијата започната во првата сесија.
     34
     35
     36Во рамки на базата на системот dbLearnStar, едно сценарио каде ова би бил валиден пример е следното. Доколку за време на испит професорот има потреба да види резултати до тој момент, наместо истото да го прави со рачно филтрирање според датумот на поднесок, истиот ефект може да го постигне преку започнување трансакција со ниво на изолација `REPEATABLE READ`.
     37{{{#!sql
     38BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
     39
     40-- Пример прашање: Број на испратени решенија од почетокот на испитот до моментот на започнување на трансакцијата
     41
     42
     43SELECT COUNT(*) as total_submissions
     44FROM student_submit_solution sss
     45JOIN student_started_test sst ON sss.student_started_test_id = sst.student_started_test_id
     46JOIN test_instance ti ON sst.test_instance_id = ti.test_instance_id
     47WHERE ti.test_collection_id = 10;
     48
     49}}}
     50
     51Во меѓувреме студентите можат непречено да работат и да испраќаат решенија. Доколку трансакцијата е отворена подолго време и професорот го изврши истиот прашалник и по 10 минути и притоа студентите имаат испратено нови решенија, резултатот ќе биде ист.
     52
     53- SERIALIZABLE
     54Ова е највисокото ниво на изолација кое го нуди PostgreSQL. Пристапот за читање е практично ист како и со READ COMMITED, но разликата е во начинот на кој се справува со менување на податоци во редиците. Доколку во една сесија се изврши следново:
     55{{{#!sql
     56BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
     57
     58UPDATE inventory SET quantity = 1 where product_id = 1;
     59}}}
     60
     61И во втора сесија се изврши:
     62{{{
     63BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
     64UPDATE inventory SET quantity = 2 where product_id = 1;
     65COMMIT;
     66}}}
     67
     68Резултатот ќе биде грешка поради тоа што SERIALIZABLE не дозволува конкурентно менување на исти записи од две трансакции (сесии).
     69
     70== Конкурентно извршување и пристап и заклучување
     71
     72PostgreSQL користи софистициран систем на заклучувања за да обезбеди конзистентност на податоците при конкурентен пристап. Заклучувањата се автоматски механизам што го контролираат пристапот до ресурсите и спречуваат конфликти помеѓу трансакциите, особено кога се извршуваат операции кои прават промени. Во PostgreSQL заклчувањата може да бидат на ниво на база, табела или ред. Иако е возможно експлицитно, со мануелно извршена команда да направиме заклучување, овој концепт генерално е управуван автоматски од системот за управување со бази на податоци.
     73
     74||= Тип заклучување =||= Автоматски се поставува при =||= Дозволува конкурентно =||= Блокира =||= Типична употреба =||
     75|| ACCESS SHARE || SELECT || Сите освен ACCESS EXCLUSIVE || ACCESS EXCLUSIVE || Читање на податоци ||
     76|| ROW SHARE || SELECT FOR UPDATE/SHARE || Повеќето операции || EXCLUSIVE, ACCESS EXCLUSIVE || Читање со намера за ажурирање ||
     77|| ROW EXCLUSIVE || INSERT, UPDATE, DELETE || Читање и други промени || SHARE и повисоки || Стандардни промени ||
     78|| SHARE UPDATE EXCLUSIVE || VACUUM, ANALYZE || Читање и ROW EXCLUSIVE || SHARE UPDATE EXCLUSIVE и повисоки || Одржување ||
     79|| SHARE || CREATE INDEX || Читање и други SHARE || ROW EXCLUSIVE и повисоки || Индексирање ||
     80|| SHARE ROW EXCLUSIVE || Ретко || Само читање || ROW EXCLUSIVE и повисоки || Специјални операции ||
     81|| EXCLUSIVE || ALTER TABLE || Само читање || Сè освен читање || Структурни промени ||
     82|| ACCESS EXCLUSIVE || DROP, TRUNCATE, VACUUM FULL || Ништо || Сите || Сите други операции ||
     83
     84Мошне корисна примена во системот за испити по бази може да има концептот на `SELECT FOR UPDATE` и `SKIP LOCKED`. Доколку постоечкото решение со прошири и е потребно последно испратените решенија на студентите за секоја од задачите, по завршување на испитот да се реизвршат врз посебна шема/база и притоа сакаме ова извршување да е паралелизирано, на повеќе инстанци (или на повеќе нитки), со примена на овој концепт можеме да го постигнеме ефектот на редица, така што секое решение кое треба да се реизврши ќе го додадеме во една табела која што ќе ја претставува редицата. Секоја од инстанците/процесите каде се извршуваат решенијата ќе го зема својот следен job со следниот прашалник
     85
     86{{{#!sql
     87SELECT * FROM submissions_queue
     88WHERE status = 'PENDING'
     89ORDER BY id
     90LIMIT 1
     91FOR UPDATE SKIP LOCKED
     92}}}
     93
     94Со ова практично добиваме две нивоа на контрола, и тоа, со користење на 'FOR UPDATE', ја заклчуваме таа редица за евентуална промена од друга сесија, а со `SKIP LOCKED` овозможуваме секој од процесите да го земе следното решение во редицата коешто не е испроцесирано, притоа избегнувајќи ги веќе заклучените
     95
     96