PostgreSQL Performance & Query Optimization · Leçon

Identifier et résoudre la contention sur les verrous

Découvrez des méthodes pratiques pour diagnostiquer et réduire la contention sur les verrous afin de garantir le bon fonctionnement des opérations de base de données.

Leçon 2 sur 411 étapes

Identifier et résoudre la contention sur les verrous est une leçon PostgreSQL Performance & Query Optimization gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage PostgreSQL Performance & Query Optimization, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours PostgreSQL Performance & Query Optimization comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

What is Lock Contention?

Imagine a busy road. When multiple cars try to use the same lane at the same time, traffic slows down or stops. In PostgreSQL, this 'traffic jam' is called lock contention.

It happens when one transaction holds a lock on a resource (like a row or table) that another transaction needs. The second transaction then has to wait for the first one to release its lock.

The Cost of Contention

Lock contention isn't just an inconvenience; it can severely impact your database's performance and application responsiveness. Here's how:

  • Increased Query Latency: Queries take longer to complete.
  • Reduced Throughput: The database processes fewer transactions per second.
  • Application Timeouts: Frontend applications might time out waiting for a database response.
  • Resource Waste: Waiting sessions consume server resources without making progress.

Identifying Waits with pg_locks

PostgreSQL provides built-in tools to help us spot contention. The pg_locks system view is your first stop. It shows all active locks held or awaited by backend processes.

Key columns to watch are pid (process ID), locktype, relation (the object being locked), mode (the type of lock), and especially granted.

Spotting Waiting Sessions

A granted = false value in pg_locks indicates a session that is currently waiting for a lock. Let's see how to query for these waiting sessions:

SELECT
  pid,
  locktype,
  relation::regclass AS locked_object,
  mode,
  granted
FROM pg_locks
WHERE granted = false;

Finding the Blocker with pg_stat_activity

Once you've identified a waiting session using pg_locks, the next step is to find out who is holding the lock and preventing it from proceeding. This is where pg_stat_activity comes in.

This view gives you details about all active sessions, including their current query, state, and when they started.

Querying for Blocking Queries

By combining information from pg_locks and pg_stat_activity, we can pinpoint blocking queries. Here's a simplified query to find active queries that might be causing contention:

SELECT
  pid,
  usename,
  application_name,
  client_addr,
  query_start,
  state,
  query
FROM pg_stat_activity
WHERE state = 'active'
  AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start ASC
LIMIT 5;

Common Causes of Contention

Understanding the root causes helps in prevention:

  • Long-Running Transactions: Transactions that hold locks for extended periods.
  • Missing Indexes: Forgetting an index can lead to full table scans, acquiring more locks than necessary.
  • DDL Operations: Commands like ALTER TABLE often require exclusive table locks.
  • 'Hot Rows' / 'Hot Pages': Frequent updates or deletions on the same few rows or data blocks.

Resolution: Shorten Transactions

One of the most effective strategies is to keep your database transactions as short and efficient as possible. This means:

  • Commit Frequently: Don't hold locks longer than needed.
  • Batch Operations: Break down large operations into smaller, manageable chunks.
  • Optimize Queries: Ensure SQL queries within transactions are highly optimized and use appropriate indexes.

Resolution: Timeouts & Skipping Locks

Sometimes, waiting indefinitely isn't an option. PostgreSQL offers ways to manage this:

  • SET lock_timeout: Prevents queries from waiting forever. The query will error out if it can't acquire a lock within the specified time.
  • FOR UPDATE SKIP LOCKED: For specific use cases (like processing a queue), this clause allows a query to skip rows that are currently locked by other transactions, rather than waiting.

Check Your Knowledge

Which of the following are effective strategies for identifying or resolving lock contention in PostgreSQL?

Recap & Next Steps

Great job! You've learned how to identify and begin resolving lock contention in PostgreSQL. We covered:

  • What lock contention is and its performance impact.
  • Using pg_locks and pg_stat_activity to find waiting sessions and their blockers.
  • Common causes like long transactions and missing indexes.
  • Key resolution strategies: shortening transactions, optimizing queries, and using lock_timeout or SKIP LOCKED.

Next, we'll dive deeper into advanced row-level locking strategies to further optimize concurrent writes!

Gratuit pour commencer

Apprends SQL avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
22
Leçons
88

Questions Fréquemment Posées

La leçon « Identifier et résoudre la contention sur les verrous » est-elle gratuite ?

Oui — le texte complet de « Identifier et résoudre la contention sur les verrous » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours PostgreSQL Performance & Query Optimization, passe à CoddyKit PRO. Le cours PostgreSQL Performance & Query Optimization comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Identifier et résoudre la contention sur les verrous » ?

Découvrez des méthodes pratiques pour diagnostiquer et réduire la contention sur les verrous afin de garantir le bon fonctionnement des opérations de base de données. Tu pratiques PostgreSQL Performance & Query Optimization avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer PostgreSQL Performance & Query Optimization ?

Aucune expérience préalable n'est requise. PostgreSQL Performance & Query Optimization sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Identifier et résoudre la contention sur les verrous » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon PostgreSQL Performance & Query Optimization ?

Oui. Chaque leçon PostgreSQL Performance & Query Optimization inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Comprendre les verrous et les interblocages
  2. Identifier et résoudre la contention sur les verrous
  3. Stratégies de verrouillage au niveau des lignes
  4. Verrous consultatifs pour coordonner les applications
← Retour à PostgreSQL Performance & Query Optimization