हाँ और नहीं - हमेशा की तरह, यह निर्भर करता है। दस्तावेज सख्ती से कहता है कि:
दूसरे शब्दों में, 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 कमिट के बाद) और कॉल रोलबैक