PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

postgresql में स्पष्ट लेनदेन अलगाव उल्लंघन

हाँ और नहीं - हमेशा की तरह, यह निर्भर करता है। दस्तावेज सख्ती से कहता है कि:

दूसरे शब्दों में, SELECT, SELECT FOR UPDATE/DELETE/UPDATE से अलग है।

आप उस व्यवहार को देखने के लिए एक साधारण टेस्ट केस बना सकते हैं:

सत्र 1

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> DELETE FROM test;
DELETE 10
test=>

अब दूसरे सत्र 2 में लॉगिन करें:

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;

अंतिम आदेश के बाद SELECT ... FOR UPDATE सत्र 1 "हैंग हो जाता है" और किसी चीज़ की प्रतीक्षा कर रहा है ......

सत्र 1 में वापस

test=> insert into test select * from generate_series(1,10);
INSERT 0 10
test=> commit;
COMMIT

और अब जब आप सत्र 2 पर वापस जाएंगे तो आप इसे देखेंगे:

test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;
 x
---
(0 rows)


test=> select * from test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

वह है - सरल SELECT अभी भी कोई परिवर्तन नहीं दिखता है, जबकि SELECT ... FOR UPDATE देखता है कि पंक्तियों को हटा दिया गया है। लेकिन यह सत्र 1 द्वारा सम्मिलित नई पंक्तियों को नहीं देखता है

वास्तव में आप जो क्रम देख रहे हैं वह है:

  • प्रक्रिया A अपना लेन-देन शुरू करती है
  • प्रक्रिया A तालिका T से सब कुछ हटा देता है
  • प्रक्रिया बी अपना लेनदेन शुरू करता है
  • प्रक्रिया B तालिका T में एक पंक्ति पर अद्यतन के लिए चयन का प्रयास करता है
  • प्रक्रिया B "हैंग हो जाती है" और सत्र A के कमिट या रोलबैक होने तक प्रतीक्षा कर रही है
  • प्रक्रिया A, आने वाले डेटा से तालिका T को फिर से बनाता है
  • प्रक्रिया A अपना लेनदेन करता है
  • प्रक्रिया B खाली आती है (0 पंक्तियाँ- सत्र A कमिट के बाद) और कॉल रोलबैक



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Google क्लाउड पर Kubernetes में Postgres डेटाबेस का बैकअप कैसे लें?

  2. PostgreSQL json_agg () फ़ंक्शन एक खाली सरणी क्यों नहीं लौटाता है?

  3. आप सक्रिय उपयोगकर्ताओं को SQL के माध्यम से postgreSQL डेटाबेस से कैसे कनेक्ट कर सकते हैं?

  4. Grails में पोस्टग्रेज़ को कॉन्फ़िगर करना

  5. कैसे टैन () PostgreSQL में काम करता है