PostgreSQL - ล็อค
ล็อคหรือExclusive ล็อคหรือล็อคเขียนป้องกันผู้ใช้จากการปรับเปลี่ยนแถวหรือทั้งตาราง แถวที่แก้ไขโดย UPDATE และ DELETE จะถูกล็อคโดยอัตโนมัติในช่วงเวลาของการทำธุรกรรม ซึ่งจะป้องกันไม่ให้ผู้ใช้รายอื่นเปลี่ยนแถวจนกว่าธุรกรรมจะเสร็จสมบูรณ์หรือย้อนกลับ
เวลาเดียวที่ผู้ใช้ต้องรอผู้ใช้รายอื่นคือเมื่อพวกเขาพยายามแก้ไขแถวเดียวกัน หากมีการปรับเปลี่ยนแถวต่างๆไม่จำเป็นต้องรอ เลือกแบบสอบถามไม่ต้องรอ
ฐานข้อมูลจะทำการล็อคโดยอัตโนมัติ อย่างไรก็ตามในบางกรณีต้องควบคุมการล็อกด้วยตนเอง การล็อคแบบแมนนวลสามารถทำได้โดยใช้คำสั่ง LOCK ช่วยให้สามารถกำหนดประเภทการล็อกและขอบเขตของธุรกรรมได้
ไวยากรณ์สำหรับคำสั่ง LOCK
ไวยากรณ์พื้นฐานสำหรับคำสั่ง LOCK มีดังนี้ -
LOCK [ TABLE ]
name
IN
lock_mode
name- ชื่อ (ที่มีคุณสมบัติตามสคีมา) ของตารางที่มีอยู่เพื่อล็อก หากระบุไว้ก่อนชื่อตารางเท่านั้นตารางนั้นจะถูกล็อก หากไม่ได้ระบุไว้เท่านั้นตารางและตารางลำดับถัดมาทั้งหมด (ถ้ามี) จะถูกล็อก
lock_mode- โหมดล็อคจะระบุว่าล็อคใดที่ล็อคนี้ขัดแย้งกับ หากไม่ได้ระบุโหมดล็อคระบบจะใช้ ACCESS EXCLUSIVE ซึ่งเป็นโหมดที่ จำกัด มากที่สุด ค่าที่เป็นไปได้ ได้แก่ ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE
เมื่อได้รับแล้วจะมีการล็อคส่วนที่เหลือของธุรกรรมปัจจุบัน ไม่มีคำสั่ง UNLOCK TABLE การล็อกจะถูกปลดล็อกเมื่อสิ้นสุดธุรกรรมเสมอ
DeadLocks
การหยุดชะงักสามารถเกิดขึ้นได้เมื่อธุรกรรมสองรายการกำลังรอให้กันและกันดำเนินการให้เสร็จสิ้น ในขณะที่ PostgreSQL สามารถตรวจจับและปิดท้ายด้วย ROLLBACK การหยุดชะงักก็ยังไม่สะดวก เพื่อป้องกันไม่ให้แอปพลิเคชันของคุณประสบปัญหานี้ตรวจสอบให้แน่ใจว่าได้ออกแบบแอปพลิเคชันในลักษณะที่จะล็อกวัตถุในลำดับเดียวกัน
คำแนะนำล็อค
PostgreSQL มีวิธีการสร้างการล็อกที่มีความหมายที่กำหนดโดยแอปพลิเคชัน เหล่านี้เรียกว่าล็อคที่ปรึกษา เนื่องจากระบบไม่บังคับให้ใช้งานจึงขึ้นอยู่กับแอปพลิเคชันที่จะใช้อย่างถูกต้อง การล็อกคำแนะนำมีประโยชน์สำหรับกลยุทธ์การล็อกที่เหมาะกับโมเดล MVCC
ตัวอย่างเช่นการใช้คำแนะนำทั่วไปในการล็อกคือการเลียนแบบกลยุทธ์การล็อกในแง่ร้ายตามแบบฉบับของระบบการจัดการข้อมูลที่เรียกว่า "ไฟล์แบน" แม้ว่าแฟล็กที่เก็บไว้ในตารางสามารถใช้เพื่อวัตถุประสงค์เดียวกันได้ แต่การล็อกคำแนะนำจะเร็วกว่าหลีกเลี่ยงการขยายตารางและเซิร์ฟเวอร์จะล้างข้อมูลโดยอัตโนมัติเมื่อสิ้นสุดเซสชัน
ตัวอย่าง
พิจารณาตารางCOMPANY ที่มีบันทึกดังนี้ -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
ตัวอย่างต่อไปนี้ล็อกตาราง COMPANY ภายในฐานข้อมูล testdb ในโหมด ACCESS EXCLUSIVE คำสั่ง LOCK ทำงานในโหมดธุรกรรมเท่านั้น -
testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
คำสั่ง PostgreSQL ข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -
LOCK TABLE
ข้อความด้านบนระบุว่าตารางถูกล็อกจนกว่าธุรกรรมจะสิ้นสุดและเพื่อสิ้นสุดธุรกรรมคุณจะต้องย้อนกลับหรือกระทำธุรกรรม