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

ข้อความด้านบนระบุว่าตารางถูกล็อกจนกว่าธุรกรรมจะสิ้นสุดและเพื่อสิ้นสุดธุรกรรมคุณจะต้องย้อนกลับหรือกระทำธุรกรรม