0Pricing
PostgreSQL Performance & Query Optimization · บทเรียน

ทำความเข้าใจล็อกและเดดล็อก

เรียนรู้เกี่ยวกับประเภทล็อกต่าง ๆ ใน PostgreSQL และวิธีระบุและป้องกันเดดล็อก

ทำความเข้าใจล็อกและเดดล็อก เป็นบทเรียน PostgreSQL Performance & Query Optimization ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PostgreSQL Performance & Query Optimization และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PostgreSQL Performance & Query Optimization มีบทเรียนทั้งหมด 4 บทเรียน

บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ

Welcome to Concurrency

When many users or applications access a database at the same time, it's called concurrency. PostgreSQL, like other databases, needs to manage these concurrent operations carefully.

Without proper management, multiple operations could try to modify the same data simultaneously, leading to inconsistencies or errors. This is where locks come in!

What are Database Locks?

A database lock is a mechanism that controls access to data by multiple transactions. It ensures that data remains consistent and prevents conflicts.

  • Data Integrity: Guarantees that data is accurate and reliable.
  • Consistency: Ensures that transactions see a consistent view of the database.
  • Conflict Prevention: Stops different operations from corrupting data by trying to write to the same place at the same time.

PostgreSQL Lock Modes

PostgreSQL uses various lock modes to define the level of access transactions have to a particular resource. These modes determine compatibility: some allow shared access, while others are exclusive.

  • ACCESS SHARE: Acquired by simple SELECT statements. Allows other transactions to also acquire ACCESS SHARE, ROW SHARE, etc.
  • ROW EXCLUSIVE: Acquired by INSERT, UPDATE, DELETE. Allows concurrent reads but prevents other transactions from acquiring ROW EXCLUSIVE on the same row.
  • ACCESS EXCLUSIVE: The most restrictive lock. Acquired by DROP TABLE or TRUNCATE. Prevents all other access to the table.

Implicit Locks in Action

Most of the time, PostgreSQL automatically acquires the necessary locks for you. These are called implicit locks.

For example:

  • When you run a SELECT query, an ACCESS SHARE lock is acquired on the table.
  • When you run an UPDATE, INSERT, or DELETE query, a ROW EXCLUSIVE lock is acquired on the affected rows and a corresponding table-level lock.

This automatic locking ensures data consistency without you needing to explicitly manage it.

Explicit Table Locks

While implicit locks handle most cases, you can also acquire locks explicitly using the LOCK TABLE command. This is useful for specific scenarios where you need to control access more precisely.

You can specify the lock mode, like ACCESS EXCLUSIVE to block all other operations, or SHARE for concurrent index creation.

Demo: Locking a Table

Try running this example. It creates a simple table and then explicitly locks it in ACCESS EXCLUSIVE mode. While this lock is held (for the duration of the transaction), no other transaction can read or write to this table.

CREATE TABLE IF NOT EXISTS inventory (
    item_id SERIAL PRIMARY KEY,
    item_name VARCHAR(100),
    quantity INT
);
TRUNCATE TABLE inventory;
INSERT INTO inventory (item_name, quantity) VALUES ('Widget A', 50);

-- This command acquires an ACCESS EXCLUSIVE lock on the 'inventory' table.
-- In a real scenario, this would block other operations until committed.
LOCK TABLE inventory IN ACCESS EXCLUSIVE MODE;

SELECT 'Table locked successfully!' AS status;

-- The lock is released when this script finishes (transaction commits).

Explicit Row Locks: SELECT FOR UPDATE

For fine-grained control, you can lock specific rows using SELECT FOR UPDATE or SELECT FOR SHARE. This is crucial for preventing race conditions in application logic.

  • SELECT ... FOR UPDATE: Acquires a ROW EXCLUSIVE lock on selected rows. Other transactions can read but cannot update or lock these rows for update until your transaction commits.
  • SELECT ... FOR SHARE: Acquires a ROW SHARE lock. Other transactions can also acquire ROW SHARE locks, but not ROW EXCLUSIVE.

Spotting Active Locks with pg_locks

To see what locks are currently active in your database, you can query the pg_locks system view. This view provides detailed information about each lock.

Key columns to look for:

  • pid: The process ID holding or waiting for the lock.
  • locktype: Type of resource being locked (e.g., relation, transactionid).
  • mode: The lock mode (e.g., ACCESS SHARE, ROW EXCLUSIVE).
  • granted: t if the lock is held, f if waiting.

You can query it like this:

SELECT * FROM pg_locks WHERE NOT granted;

Understanding Deadlocks

A deadlock occurs when two or more transactions are waiting for each other to release a resource, resulting in a standstill. Neither transaction can proceed.

PostgreSQL automatically detects deadlocks and aborts one of the transactions (the 'deadlock victim') to allow the other to complete. This usually results in an error message for the aborted transaction.

A Classic Deadlock Scenario

Imagine two transactions, T1 and T2, trying to update two rows, Row A and Row B:

  • T1: Locks Row A, then tries to lock Row B.
  • T2: Locks Row B, then tries to lock Row A.

At this point, T1 holds A and waits for B, while T2 holds B and waits for A. Neither can progress. PostgreSQL detects this cycle and terminates one transaction.

Lock Mode Check

Which lock mode is typically acquired by a simple SELECT statement?

Recap: Locks & Deadlocks

We've covered the essentials of database locks and deadlocks in PostgreSQL. Locks ensure data consistency and integrity in concurrent environments, operating through various lock modes.

Remember:

  • PostgreSQL uses implicit and explicit locks.
  • pg_locks helps monitor active locks.
  • Deadlocks occur when transactions wait for each other, and PostgreSQL detects and resolves them by aborting one transaction.

Understanding these concepts is key to building robust and performant applications!

คำถามที่พบบ่อย

บทเรียน “ทำความเข้าใจล็อกและเดดล็อก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ทำความเข้าใจล็อกและเดดล็อก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PostgreSQL Performance & Query Optimization ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PostgreSQL Performance & Query Optimization มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ทำความเข้าใจล็อกและเดดล็อก”

เรียนรู้เกี่ยวกับประเภทล็อกต่าง ๆ ใน PostgreSQL และวิธีระบุและป้องกันเดดล็อก คุณปฏิบัติ PostgreSQL Performance & Query Optimization ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PostgreSQL Performance & Query Optimization หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PostgreSQL Performance & Query Optimization บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ทำความเข้าใจล็อกและเดดล็อก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PostgreSQL Performance & Query Optimization นี้ได้ไหม

ได้ บทเรียน PostgreSQL Performance & Query Optimization ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ทำความเข้าใจล็อกและเดดล็อก
  2. การระบุและแก้ไขการแย่งใช้ล็อก
  3. กลยุทธ์การล็อกระดับแถว
  4. ล็อกคำแนะนำสำหรับการประสานงานระหว่างแอปพลิเคชัน
← กลับไปที่ PostgreSQL Performance & Query Optimization