2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
Concurrentes renovationis conflictus fieri possunt cum duo vel plures transactiones eundem ordinem notitiarum simul mutare conantur. Communes missiones includit:
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.
PostgreSQL plura genera comarum utitur ad accessum ad notitias concurrentes moderandas. Typi communes cincinno includit:
Sera granularitas potest esse ordo graduum (Row-Level), page-level (Page-Level) et mensa-gradus (Table-Level).
PostgreSQL quatuor gradus transactionis solitudo sustinet:
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;
$$;
In exemplo superiore, si operatio renovatio aliquos ordines non afficit (indicio potest conflictum esse), vexillum positum est, tempus expectat et iterum conatur.
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;
In exemplo superiore, operatio renovatio tantum succedit si notitia ab aliis negotiis mutata non est.
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;
Agrum versionem ad mensam addere ad mutationes indagare data.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price DECIMAL(10, 2),
version INT DEFAULT 0
);
Cum notitia adaequationis, etiam incremento versionis campus;
UPDATE products SET price = 100, version = version + 1 WHERE id = 1 AND version = <expected_version>;
Si numerus ordinum affectus renovationis est 0, conflictus est quia versio expectata cum actuali versioni repugnat.
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
);
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>;
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
);
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;
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;
Si hae duae res eodem fere tempore fiunt, conflictus fieri potest.
Si utimur indicatione secundum conflictus resolutio;
T1
)。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.
🎉相关推荐