Technology sharing

Quomodo solutionem conflictus tractare pro concursantibus updates datorum in PostgreSQL?

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

pulchra linea

PostgreSQL


In ambitu database operationi concurrente, plures operationes quaerunt ut easdem notitias simul renovare possint conflictationes causare. PostgreSQL seriem mechanismorum praebet ad conflictationes concurrentes has tractandas ut notitia constantiae et integritatis curet.

pulchra linea

1. Concurrent update conflictus missiones

Concurrentes renovationis conflictus fieri possunt cum duo vel plures transactiones eundem ordinem notitiarum simul mutare conantur. Communes missiones includit:

  1. Mutare varias columnas eiusdem ordinis simul
  2. Renova valores eiusdem columnae simul

pulchra linea

2. Concurrency control mechanism in PostgreSQL

PostgreSQL maxime utitur MVCC (Multiversio Concurrency Control) ad res concurrentes tractandas. MVCC permittit transactionem legere versioni datae quae ad campestrem solitariam requisita non obvenit ut operationes aliarum transactionum lectas intercluderent. Pugnae tamen adhuc occurrunt in operationibus scribendis.

(I) Clausus mechanism

PostgreSQL plura genera comarum utitur ad accessum ad notitias concurrentes moderandas. Typi communes cincinno includit:

  1. Communese Obfirmo: Alias ​​res permittit comas communes acquirere, sed crines exclusivas ne acquiri prohibet. Vulgo usus est pro operibus legere.
  2. Exclusivum Obfirme: Prohibet alias transactiones quovis genere seram acquirere, saepe ad operationes scribendas adhibitas.

Sera granularitas potest esse ordo graduum (Row-Level), page-level (Page-Level) et mensa-gradus (Table-Level).

(II) transactionis gradu solitudo

PostgreSQL quatuor gradus transactionis solitudo sustinet:

  1. Read Uncommitted: Hic est infimus solitudo campestris. Transactio non potest legere notitiarum modificationum indefinitorum aliorum negotiorum, quae ad difficultates ducere possunt ut sordida legit, non iterabilia legit, et phantasma legit.
  2. Read Committed: Transactiones tantum legi possunt submissae notitiae, sordidae vitantes legit, sed non-repetitae legit et phantasma legentis adhuc occurrunt.
  3. Iterarium Read: perlectis eadem notitia multipliciter intra transactionem idem proveniet, vitans non iterabilis legit, sed phantasma legit forte occurrere.
  4. Serializable: Supremus campus solitudo, Vide exsecutio transactions per strictam concurrentiam control, vitans sordida legit, non iterabilis legit et phantasma legit.

pulchra linea

3. Solutio ad conflictus concurrentes renovatio

(I) Retry mechanism

Simplex accessio est ad rem retry cum pugna fit. Exempla sunt haec:

DO
$$
DECLARE
    conflict_detected BOOLEAN := FALSE;
BEGIN
    LOOP
        -- 尝试执行更新操作
        UPDATE products SET price = 100 WHERE id = 1;

        -- 检查是否有冲突(例如,通过检查受影响的行数)
        IF NOT FOUND THEN
            conflict_detected := TRUE;
        ELSE
            EXIT;
        END IF;

        -- 若有冲突,等待一段时间并重试
        IF conflict_detected THEN
            PERFORM pg_sleep(1);
        END IF;
    END LOOP;
END;
$$;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

In exemplo superiore, si operatio renovatio aliquos ordines non afficit (indicio potest conflictum esse), vexillum positum est, tempus expectat et iterum conatur.

(II) utere eu Concurrency imperium

Concursus optimatium imperium assumit quod concursus conflictus raro fiunt. Hoc modo, transactionem non claudit cum adaequationis notae, sed impedit num notitia ab aliis negotiis in committendo modificata sit. Si certamina non sunt, negotium feliciter committit;

-- 获取数据的初始版本
SELECT price AS original_price FROM products WHERE id = 1;

-- 进行业务处理和修改
UPDATE products SET price = 100 WHERE id = 1 AND price = original_price;
  • 1
  • 2
  • 3
  • 4
  • 5

In exemplo superiore, operatio renovatio tantum succedit si notitia ab aliis negotiis mutata non est.

(III) usus concurrit imperium pessimistic

Concursus pessimisticus imperium ponit quod concursus conflictus verisimile fieri possunt, et debitas comas in executione transactionis acquirit ut alias potentiae negotiorum repugnantium intercludat.

BEGIN;

-- 获取排他锁
LOCK TABLE products IN SHARE ROW EXCLUSIVE MODE;

-- 进行数据更新
UPDATE products SET price = 100 WHERE id = 1;

COMMIT;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(IV) Application versio agri

Agrum versionem ad mensam addere ad mutationes indagare data.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    price DECIMAL(10, 2),
    version INT DEFAULT 0
);
  • 1
  • 2
  • 3
  • 4
  • 5

Cum notitia adaequationis, etiam incremento versionis campus;

UPDATE products SET price = 100, version = version + 1 WHERE id = 1 AND version = <expected_version>;
  • 1

Si numerus ordinum affectus renovationis est 0, conflictus est quia versio expectata cum actuali versioni repugnat.

(V) conflictus resolutio secundum indicatione

Agrum indicationem addere singulis ordinis notitiarum notare novissimam modificationem temporis notitiarum.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    price DECIMAL(10, 2),
    last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 1
  • 2
  • 3
  • 4
  • 5

Cum adaequationis, tantum notitias renovationis cum indicatione temporis antiquioris quam indicatione hodiernae transactionis legunt;

UPDATE products SET price = 100 WHERE id = 1 AND last_modified <= <read_timestamp>;
  • 1

pulchra linea

4. Considerationes in Practical Applications

(I) euismod impulsum

  1. Diversi conflictus solutionis modi habent diversas impactiones in perficientur datorum. Exempli causa, usus interclusio alias res moram facere potest, tempus systematis interclusio augere, et sic concursum afficere. Concursus optimatium moderamen melius facit cum pugnae raro fiunt, sed cum saepe pugnae fiunt, potest ad magnum numerum retrarum transactionis ducere, tempus universale exsecutionis augens.
  2. Applicatio versionis agrorum vel methodi indicationis fundatae, postulare potest additional spatium repono ad informationem vel versionem indicationis conservandam, ac addito iudicio et processui cum adaequationis.

(2) Negotia logicae aptabilitas

  1. Negotium missionum certarum potest aptius esse ad certae certae solutionis methodum. Exempli gratia, si negotium altissimum habet requisita pro notitia constantiae et aliquas repugnantias ferre non potest, tunc concursus pessimisticus moderatio vel gradus separatio serialization melior electio esse potest.
  2. Concursus optimatium moderatio aptior esse potest pro missionibus in quibus conflictationes minus frequentes sunt et responsionis temporis requisita superiora sunt.

(3) Data distribution and access patterns

  1. Si accessus ad notitias valde concurrit, pluresque transactiones saepe eodem ordine datae simul accesserunt, conflictus solutionis methodi diligentius eligendus est ut nimias interclusiones et conflictus vitet.
  2. Ad condiciones in quibus data distributio relative uniformis est et probabilitas certaminis humilis est, methodi relative simplices et efficientes adhiberi possunt, ut concursus optimae temperantiae.

pulchra linea

5. Exemplum analysis

Puta nos habere inventarium administrationis ratio pro an online copia cum a inventory mensam condere inventarium quantitates rerum.

CREATE TABLE inventory (
    product_id INT PRIMARY KEY,
    quantity INT,
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 1
  • 2
  • 3
  • 4
  • 5

Nunc sunt duo operationes concurrentes:

Transaction 1:

BEGIN;
SELECT * FROM inventory WHERE product_id = 1;
-- 假设读取到的数量为 10
UPDATE inventory SET quantity = 5 WHERE product_id = 1 AND last_updated <= <read_timestamp>;
COMMIT;
  • 1
  • 2
  • 3
  • 4
  • 5

Transactio 2:

BEGIN;
SELECT * FROM inventory WHERE product_id = 1;
-- 假设也读取到的数量为 10
UPDATE inventory SET quantity = 8 WHERE product_id = 1 AND last_updated <= <read_timestamp>;
COMMIT;
  • 1
  • 2
  • 3
  • 4
  • 5

Si hae duae res eodem fere tempore fiunt, conflictus fieri potest.

Si utimur indicatione secundum conflictus resolutio;

  1. Transactio I adeptus current indicatione cum legere notitia (T1)。
  2. Transactio II nactus paulo post indicatione temporis cum legere notitia (T2)。

Cum transaction 1 inceptis renovare debet, si nulla alia transactio notitias cum illo legat (i.e. last_updated <= T1) Renovatio est felix.

Cum res 2 renovare conatur, si data invenit last_updated plus quamT2(indicans eam mutatam esse post transactionem 2 legere eam), renovatio deficit, et transactio 2 eligere potest iterum revolvere et experiri, aut alium processum secundum logicam negotiationem exercere.


pulchra linea

🎉相关推荐

PostgreSQL