प्रौद्योगिकी साझेदारी

PostgreSQL मध्ये आँकडानां समवर्ती अद्यतनीकरणार्थं द्वन्द्वनिराकरणं कथं नियन्त्रयितुं शक्यते?

2024-07-12

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

सुन्दर विभाजनरेखा

PostgreSQL


दत्तांशकोशसमवर्तीसञ्चालनवातावरणे एकस्मिन् समये समानदत्तांशं अद्यतनीकर्तुं प्रयतमानानां बहुविधव्यवहारानाम् कारणेन विग्रहः भवितुम् अर्हति । PostgreSQL एतान् समवर्ती अद्यतनसङ्घर्षान् नियन्त्रयितुं तन्त्राणां श्रृङ्खलां प्रदाति यत् आँकडानां संगतिः अखण्डतां च सुनिश्चितं भवति ।

सुन्दर विभाजनरेखा

1. समवर्ती अद्यतनं द्वन्द्वपरिदृश्यानि

यदा द्वौ वा अधिकौ व्यवहारौ एकस्मिन् समये एकां दत्तांशपङ्क्तिं परिवर्तयितुं प्रयतन्ते तदा समवर्ती अद्यतनविग्रहाः भवितुम् अर्हन्ति । सामान्यपरिदृश्यानि सन्ति- १.

  1. एकस्मिन् एव पङ्क्तौ भिन्नाः स्तम्भाः परिवर्तयन्तु
  2. एकस्मिन् समये एकस्यैव स्तम्भस्य भिन्नानि मूल्यानि अद्यतनं कुर्वन्तु

सुन्दर विभाजनरेखा

2. PostgreSQL इत्यस्मिन् समवर्तीनियन्त्रणतन्त्रम्

PostgreSQL मुख्यतया समवर्ती लेनदेनं नियन्त्रयितुं MVCC (Multiversion Concurrency Control) इत्यस्य उपयोगं करोति । MVCC अन्यव्यवहारानाम् पठनसञ्चालनानि अवरुद्ध्य ताडनं विना तस्य पृथक्करणस्तरस्य आवश्यकतां पूरयति इति दत्तांशसंस्करणं पठितुं लेनदेनं अनुमन्यते । परन्तु लेखनक्रियासु अद्यापि विग्रहाः भवितुम् अर्हन्ति ।

(1) अवरोधन तन्त्रम्

PostgreSQL आँकडानां समवर्ती अभिगमनं नियन्त्रयितुं अनेकप्रकारस्य तालानां उपयोगं करोति । सामान्यतालाप्रकारेषु अन्तर्भवति : १.

  1. साझा ताला: अन्येषां व्यवहारानां साझा तालान् प्राप्तुं अनुमतिं ददाति, परन्तु अनन्यतालान् अधिग्रहणं निवारयति । सामान्यतया पठनक्रियाणां कृते उपयुज्यते ।
  2. अनन्यताला: अन्येषां लेनदेनानाम् किमपि प्रकारस्य तालान् प्राप्तुं निवारयति, यत् प्रायः लेखनक्रियाणां कृते उपयुज्यते ।

ताला-दानेदारता पङ्क्ति-स्तरः (Row-Level), पृष्ठ-स्तरः (Page-Level) तथा च सारणी-स्तरः (Table-Level) भवितुम् अर्हति ।

(2) लेनदेन पृथक्करण स्तर

PostgreSQL चतुर्णां लेनदेनपृथक्करणस्तरानाम् समर्थनं करोति:

  1. अप्रतिबद्धं पठन्तु: एषः न्यूनतमः पृथक्करणस्तरः अस्ति ।
  2. पठन्तु प्रतिबद्धः: व्यवहाराः केवलं प्रस्तुतदत्तांशं पठितुं शक्नुवन्ति, मलिनपठनानि परिहरन्ति, परन्तु अपुनरावृत्तिपठनानि प्रेतपठनानि च अद्यापि भवितुम् अर्हन्ति ।
  3. पुनरावृत्तिः पठनीयः: लेनदेनस्य अन्तः एकमेव दत्तांशं बहुवारं पठित्वा समानं परिणामं प्राप्स्यति, अ-पुनरावृत्ति-पठनं परिहरति, परन्तु प्रेत-पठनं भवितुम् अर्हति ।
  4. क्रमिकीकरणीय: उच्चतमः पृथक्करणस्तरः, सख्तसमवर्तीनियन्त्रणद्वारा लेनदेनस्य क्रमिकनिष्पादनं सुनिश्चित्य, गन्दपठनानि, अपुनरावृत्तिपठनानि, प्रेतपठनानि च परिहरन्ति।

सुन्दर विभाजनरेखा

3. समवर्ती अद्यतनविग्रहस्य समाधानम्

(1) पुनः प्रयासं तन्त्रम्

सरलः उपायः अस्ति यत् यदा विग्रहः भवति तदा व्यवहारस्य पुनः प्रयासः करणीयः । उदाहरणानि यथा- १.

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

उपरिष्टाद् उदाहरणे यदि अद्यतनक्रिया कस्यापि पङ्क्तिं न प्रभावितं करोति (विग्रहः भवितुम् अर्हति इति सूचयति), तर्हि ध्वजः सेट् भवति, समयकालं प्रतीक्षते, ततः पुनः प्रयासं करोति

(2) आशावादी समवर्तीनियन्त्रणस्य उपयोगं कुर्वन्तु

आशावादी समवर्तीनियन्त्रणं समवर्तीविग्रहाः दुर्लभाः इति कल्पयति । अस्मिन् पद्धत्या दत्तांशस्य अद्यतनीकरणे व्यवहारः लॉक् न भवति, परन्तु प्रतिबद्धतायां दत्तांशः अन्यैः व्यवहारैः परिवर्तितः अस्ति वा इति परीक्षते । यदि विग्रहाः न सन्ति तर्हि व्यवहारः सफलतया प्रतिबद्धः भवति यदि विग्रहाः सन्ति तर्हि व्यवहारः पुनः रोल कृत्वा आवश्यकतानुसारं पुनः प्रयासः क्रियते ।

-- 获取数据的初始版本
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

उपर्युक्ते उदाहरणे अद्यतनक्रिया तदा एव सफला भवति यदा अन्यैः व्यवहारैः दत्तांशः परिवर्तितः नास्ति ।

(3) निराशावादी समवर्ती नियन्त्रणस्य प्रयोगं कुर्वन्तु

निराशावादी समवर्तीनियन्त्रणं समवर्तीविग्रहाणां सम्भावना इति कल्पयति, अन्येषां सम्भाव्यविग्रहयुक्तव्यवहारानाम् अवरुद्ध्यर्थं व्यवहारनिष्पादनस्य समये आवश्यकानि तालानि अधिगच्छति

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

(4) अनुप्रयोगसंस्करणक्षेत्रम्

दत्तांशस्य परिवर्तनं निरीक्षितुं सारणीयां संस्करणक्षेत्रं योजयन्तु ।

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

दत्तांशं अद्यतनं कुर्वन् संस्करणक्षेत्रमपि वर्धयन्तु:

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

यदि अद्यतनेन प्रभावितानां पङ्क्तीनां संख्या 0 भवति तर्हि अपेक्षितं संस्करणं वास्तविकसंस्करणेन सह असङ्गतं भवति इति कारणेन विग्रहः भवति ।

(5) समयमुद्राधारितं द्वन्द्वनिराकरणम्

दत्तांशस्य अन्तिमसंशोधनसमयं अभिलेखयितुं प्रत्येकं दत्तांशपङ्क्तौ समयमुद्रिकाक्षेत्रं योजयन्तु ।

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

अद्यतनं कुर्वन् केवलं वर्तमानव्यवहारेन पठितस्य समयमुद्रायाः अपेक्षया प्राचीनसमयमुद्रणेन सह दत्तांशं अद्यतनं कुर्वन्तु:

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

सुन्दर विभाजनरेखा

4. व्यावहारिकप्रयोगेषु विचाराः

(1) कार्यप्रदर्शन प्रभाव

  1. विभिन्नानां द्वन्द्वनिराकरणपद्धतीनां दत्तांशकोशस्य कार्यप्रदर्शने भिन्नः प्रभावः भवति । यथा, अवरोधनस्य उपयोगेन अन्येषां व्यवहारानां प्रतीक्षा भवति, प्रणाल्याः अवरोधसमयः वर्धते, एवं च समवर्ती प्रभावः भवति । आशावादी समवर्तीनियन्त्रणं तदा उत्तमं प्रदर्शनं करोति यदा विग्रहाः दुर्लभाः भवन्ति, परन्तु यदा विग्रहाः बहुधा भवन्ति तदा तस्य कारणेन बहुसंख्यया लेनदेनस्य पुनः प्रयासः भवितुं शक्नोति, येन समग्रनिष्पादनसमयः वर्धते
  2. संस्करणक्षेत्राणि अथवा समयमुद्रिका-आधारितविधयः प्रयोक्तुं संस्करणस्य अथवा समयमुद्रिकासूचनाः निर्वाहयितुम् अतिरिक्तभण्डारणस्थानस्य आवश्यकता भवितुम् अर्हति, तथा च अद्यतनीकरणकाले अतिरिक्तनिर्णयः संसाधनं च कर्तुं शक्नोति

(2) व्यावसायिक तर्क अनुकूलता

  1. कतिपयव्यापारपरिदृश्याः विशिष्टविग्रहनिराकरणपद्धत्याः कृते अधिकं उपयुक्ताः भवितुम् अर्हन्ति । उदाहरणार्थं, यदि व्यवसायस्य दत्तांशसङ्गतिविषये अतीव उच्चाः आवश्यकताः सन्ति तथा च किमपि असङ्गतिं सहितुं न शक्नोति, तर्हि निराशावादी समवर्तीनियन्त्रणं वा क्रमिकीकरणपृथक्करणस्तरः उत्तमः विकल्पः भवितुम् अर्हति
  2. आशावादी समवर्तीनियन्त्रणं तेषु परिदृश्येषु अधिकं उपयुक्तं भवितुम् अर्हति यत्र द्वन्द्वाः न्यूनाः भवन्ति तथा च प्रतिक्रियासमयस्य आवश्यकता अधिका भवति ।

(3) आँकडावितरणं अभिगमप्रतिमानं च

  1. यदि दत्तांशस्य अभिगमः अत्यन्तं समवर्ती भवति, तथा च बहुविधाः व्यवहाराः प्रायः एकस्मिन् समये समानानि दत्तांशपङ्क्तयः अभिगच्छन्ति, तर्हि अत्यधिकं अवरोधनं, विग्रहं च परिहरितुं विग्रहनिराकरणविधयः अधिकसावधानीपूर्वकं चयनं कर्तुं आवश्यकाः सन्ति
  2. यत्र दत्तांशवितरणं तुल्यकालिकरूपेण एकरूपं भवति तथा च विग्रहसंभावना न्यूना भवति, तत्र आशावादी समवर्तीनियन्त्रणम् इत्यादीनां तुल्यकालिकसरलानां कुशलानाञ्च पद्धतीनां उपयोगः कर्तुं शक्यते

सुन्दर विभाजनरेखा

5. उदाहरणविश्लेषणम्

मानातु अस्माकं कृते एकस्य ऑनलाइन-भण्डारस्य कृते इन्वेण्ट्री-प्रबन्धन-व्यवस्था अस्ति यत्र a inventory वस्तुनां सूचीमात्रायाः संग्रहणार्थं सारणी।

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

अधुना द्वौ समवर्ती व्यवहारौ स्तः- १.

व्यवहारः १ : १.

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

व्यवहारः २ : १.

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

यदि एतयोः व्यवहारयोः प्रायः एकस्मिन् समये निष्पादितः भवति तर्हि विग्रहः भवितुम् अर्हति ।

यदि वयं समयमुद्रिकाधारितं द्वन्द्वनिराकरणं उपयुञ्ज्महे:

  1. व्यवहारः १ दत्तांशं पठन् वर्तमानसमयमुद्रां प्राप्तवान् (T1)。
  2. व्यवहारः २ दत्तांशं पठन् किञ्चित् पश्चात् समयमुद्रिकां प्राप्तवान् (T2)。

यदा व्यवहारः १ अद्यतनीकरणस्य प्रयासं करोति, यदि अन्यः कोऽपि व्यवहारः पठितस्य दत्तांशस्य परिवर्तनं न कृतवान् (अर्थात् । last_updated <= T1), अद्यतनं सफलम् अस्ति ।

यदा व्यवहारः २ अद्यतनं कर्तुं प्रयतते, यदि तत् दत्तांशं पश्यति last_updated अधिकंT2(व्यवहारः २ पठित्वा परिवर्तनं जातम् इति सूचयति), अद्यतनं विफलं भवति, व्यवहारः २ पुनः रोल कृत्वा पुनः प्रयासं कर्तुं, अथवा व्यावसायिकतर्कस्य अनुसारं अन्यप्रक्रियाकरणं कर्तुं चयनं कर्तुं शक्नोति


सुन्दर विभाजनरेखा

🎉相关推荐

PostgreSQL