2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
दत्तांशकोशसमवर्तीसञ्चालनवातावरणे एकस्मिन् समये समानदत्तांशं अद्यतनीकर्तुं प्रयतमानानां बहुविधव्यवहारानाम् कारणेन विग्रहः भवितुम् अर्हति । PostgreSQL एतान् समवर्ती अद्यतनसङ्घर्षान् नियन्त्रयितुं तन्त्राणां श्रृङ्खलां प्रदाति यत् आँकडानां संगतिः अखण्डतां च सुनिश्चितं भवति ।
यदा द्वौ वा अधिकौ व्यवहारौ एकस्मिन् समये एकां दत्तांशपङ्क्तिं परिवर्तयितुं प्रयतन्ते तदा समवर्ती अद्यतनविग्रहाः भवितुम् अर्हन्ति । सामान्यपरिदृश्यानि सन्ति- १.
PostgreSQL मुख्यतया समवर्ती लेनदेनं नियन्त्रयितुं MVCC (Multiversion Concurrency Control) इत्यस्य उपयोगं करोति । MVCC अन्यव्यवहारानाम् पठनसञ्चालनानि अवरुद्ध्य ताडनं विना तस्य पृथक्करणस्तरस्य आवश्यकतां पूरयति इति दत्तांशसंस्करणं पठितुं लेनदेनं अनुमन्यते । परन्तु लेखनक्रियासु अद्यापि विग्रहाः भवितुम् अर्हन्ति ।
PostgreSQL आँकडानां समवर्ती अभिगमनं नियन्त्रयितुं अनेकप्रकारस्य तालानां उपयोगं करोति । सामान्यतालाप्रकारेषु अन्तर्भवति : १.
ताला-दानेदारता पङ्क्ति-स्तरः (Row-Level), पृष्ठ-स्तरः (Page-Level) तथा च सारणी-स्तरः (Table-Level) भवितुम् अर्हति ।
PostgreSQL चतुर्णां लेनदेनपृथक्करणस्तरानाम् समर्थनं करोति:
सरलः उपायः अस्ति यत् यदा विग्रहः भवति तदा व्यवहारस्य पुनः प्रयासः करणीयः । उदाहरणानि यथा- १.
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;
$$;
उपरिष्टाद् उदाहरणे यदि अद्यतनक्रिया कस्यापि पङ्क्तिं न प्रभावितं करोति (विग्रहः भवितुम् अर्हति इति सूचयति), तर्हि ध्वजः सेट् भवति, समयकालं प्रतीक्षते, ततः पुनः प्रयासं करोति
आशावादी समवर्तीनियन्त्रणं समवर्तीविग्रहाः दुर्लभाः इति कल्पयति । अस्मिन् पद्धत्या दत्तांशस्य अद्यतनीकरणे व्यवहारः लॉक् न भवति, परन्तु प्रतिबद्धतायां दत्तांशः अन्यैः व्यवहारैः परिवर्तितः अस्ति वा इति परीक्षते । यदि विग्रहाः न सन्ति तर्हि व्यवहारः सफलतया प्रतिबद्धः भवति यदि विग्रहाः सन्ति तर्हि व्यवहारः पुनः रोल कृत्वा आवश्यकतानुसारं पुनः प्रयासः क्रियते ।
-- 获取数据的初始版本
SELECT price AS original_price FROM products WHERE id = 1;
-- 进行业务处理和修改
UPDATE products SET price = 100 WHERE id = 1 AND price = original_price;
उपर्युक्ते उदाहरणे अद्यतनक्रिया तदा एव सफला भवति यदा अन्यैः व्यवहारैः दत्तांशः परिवर्तितः नास्ति ।
निराशावादी समवर्तीनियन्त्रणं समवर्तीविग्रहाणां सम्भावना इति कल्पयति, अन्येषां सम्भाव्यविग्रहयुक्तव्यवहारानाम् अवरुद्ध्यर्थं व्यवहारनिष्पादनस्य समये आवश्यकानि तालानि अधिगच्छति
BEGIN;
-- 获取排他锁
LOCK TABLE products IN SHARE ROW EXCLUSIVE MODE;
-- 进行数据更新
UPDATE products SET price = 100 WHERE id = 1;
COMMIT;
दत्तांशस्य परिवर्तनं निरीक्षितुं सारणीयां संस्करणक्षेत्रं योजयन्तु ।
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price DECIMAL(10, 2),
version INT DEFAULT 0
);
दत्तांशं अद्यतनं कुर्वन् संस्करणक्षेत्रमपि वर्धयन्तु:
UPDATE products SET price = 100, version = version + 1 WHERE id = 1 AND version = <expected_version>;
यदि अद्यतनेन प्रभावितानां पङ्क्तीनां संख्या 0 भवति तर्हि अपेक्षितं संस्करणं वास्तविकसंस्करणेन सह असङ्गतं भवति इति कारणेन विग्रहः भवति ।
दत्तांशस्य अन्तिमसंशोधनसमयं अभिलेखयितुं प्रत्येकं दत्तांशपङ्क्तौ समयमुद्रिकाक्षेत्रं योजयन्तु ।
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price DECIMAL(10, 2),
last_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
अद्यतनं कुर्वन् केवलं वर्तमानव्यवहारेन पठितस्य समयमुद्रायाः अपेक्षया प्राचीनसमयमुद्रणेन सह दत्तांशं अद्यतनं कुर्वन्तु:
UPDATE products SET price = 100 WHERE id = 1 AND last_modified <= <read_timestamp>;
मानातु अस्माकं कृते एकस्य ऑनलाइन-भण्डारस्य कृते इन्वेण्ट्री-प्रबन्धन-व्यवस्था अस्ति यत्र a inventory
वस्तुनां सूचीमात्रायाः संग्रहणार्थं सारणी।
CREATE TABLE inventory (
product_id INT PRIMARY KEY,
quantity INT,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
अधुना द्वौ समवर्ती व्यवहारौ स्तः- १.
व्यवहारः १ : १.
BEGIN;
SELECT * FROM inventory WHERE product_id = 1;
-- 假设读取到的数量为 10
UPDATE inventory SET quantity = 5 WHERE product_id = 1 AND last_updated <= <read_timestamp>;
COMMIT;
व्यवहारः २ : १.
BEGIN;
SELECT * FROM inventory WHERE product_id = 1;
-- 假设也读取到的数量为 10
UPDATE inventory SET quantity = 8 WHERE product_id = 1 AND last_updated <= <read_timestamp>;
COMMIT;
यदि एतयोः व्यवहारयोः प्रायः एकस्मिन् समये निष्पादितः भवति तर्हि विग्रहः भवितुम् अर्हति ।
यदि वयं समयमुद्रिकाधारितं द्वन्द्वनिराकरणं उपयुञ्ज्महे:
T1
)。T2
)。यदा व्यवहारः १ अद्यतनीकरणस्य प्रयासं करोति, यदि अन्यः कोऽपि व्यवहारः पठितस्य दत्तांशस्य परिवर्तनं न कृतवान् (अर्थात् । last_updated <= T1
), अद्यतनं सफलम् अस्ति ।
यदा व्यवहारः २ अद्यतनं कर्तुं प्रयतते, यदि तत् दत्तांशं पश्यति last_updated
अधिकंT2
(व्यवहारः २ पठित्वा परिवर्तनं जातम् इति सूचयति), अद्यतनं विफलं भवति, व्यवहारः २ पुनः रोल कृत्वा पुनः प्रयासं कर्तुं, अथवा व्यावसायिकतर्कस्य अनुसारं अन्यप्रक्रियाकरणं कर्तुं चयनं कर्तुं शक्नोति
🎉相关推荐