http://www.postgresql-support.de

Deadlocks

In den allermeisten Fällen modifziert eine Transaktion mehr als nur einen Datensatz. Sofern verschiedene Transaktionen die selben Datensätze modifizieren, kann es unter gewissen Umständen zu sogenannten Deadlocks kommen, die PostgreSQL automatisch auflösen kann. Stellen wir uns den folgenden Datenbestand vor:

test=# CREATE TABLE t_daten (a int4);
CREATE TABLE
test=# INSERT INTO t_daten VALUES (1);
INSERT 5929730 1
test=# INSERT INTO t_daten VALUES (2);
INSERT 5929731 1

Wenn zwei Transaktionen Datensätze in unterschiedlicher Reihenfolge editieren, kann es zu einem Deadlock kommen:

BEGIN BEGIN
UPDATE t_daten SET a = 20 WHERE a = 2; UPDATE t_daten SET a = 10 WHERE a = 1;
UPDATE t_daten SET a = 20 WHERE a = 1; UPDATE t_daten SET a = 10 WHERE a = 2;

Das Problem ist, dass die linke Transaktion den zweiten Datensatz sperrt. In weiterer Folge sperrt die rechte Transaktion den ersten Datensatz. Da nun beide Backends auf den jeweils anderen Datensatz zugreifen wollen, entsteht ein Deadlock. In diesem Fall bricht PostgreSQL eine der beiden Transaktionen ab:

ERROR:  deadlock detected
DETAIL:  Process 15596 waits for ShareLock on transaction 241260; 
	blocked by process 15527.
Process 15527 waits for ShareLock on transaction 241262; blocked 
	by process 15596.

Deadlocks sind ein wichtiges Thema und müssen bei praktischen Anwendungen auf alle Fälle bedacht werden.

http://www.postgresql.at