Deadlock bei INSERTS in eine Tabelle

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich habe 2 Threads, die jeweils versuchen, 2 gleiche Entity-Beans auf die Datenbank zu inserten.
Thread 1:
'1' 'Ratna'
'2' 'Sandy'

Thread 2:
'1' 'Ratna'
'2' 'Sandy'

Wir haben also auf JPA-Kontext lediglich eine Anwendungslogik für die 2 Threads.

Ich bin auf Deadlock gestoßen. Auf der Suche nach der Suche habe ich die naheliegendste Ursache gefunden, warum diese INSERTS zu Deadlock führen. Stichwort dafür ist: PrimaryKey-Overlapping. In der Tat ist die 1. Spalte ein PrimaryKey.

Ein gutes Beispiel im Netz ist:

Code:
-- Session 1: Insert row 1
BEGIN TRAN
INSERT INTO deadlocks
VALUES (1, 'Pinal', 'SQLAuth')
-- ----------------------
-- Session 2: Insert Row 2
BEGIN TRAN
INSERT INTO deadlocks
VALUES (10, 'SQLAuth', 'Blog')
-- ----------------------
-- Session 1: Insert row 2
INSERT INTO deadlocks
VALUES (10, 'SQLAuth', 'Blog')
-- ----------------------
-- Session 2: Insert Row 1
INSERT INTO deadlocks
VALUES (1, 'Pinal', 'SQLAuth')

Was ich nicht dahinter komme, ist allerdings:
Wir haben doch aber für die beiden Threads die gleiche Reihenfolge, nicht wie im obigen Beispiel:
S1-1
S2-2
S1-2
S2-1

Stattdessen habe ich ja:
S1-1
S2-1
S1-2
S2-2

Oder
S1-1
S1-2
S2-1
S2-2

Die Reihenfolge, die wir haben, dürfte aber niemals zu einem Deadlock führen.

Daher meine Fragen:
1. Ist es denn wahrscheinlich, dass eine Reihenfolge auf JPA-Context anders sein kann wenn die Statements auf Datenbank-Seite angekommen ist?

Vielen Dank für Eure Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna
 
Hi

Nicht wirklich viel Erfahrung damit, aber:

Ja, Statements werden zwischengespeichert und beliebig umsortiert. Gründe sind zB. das Inserts in die selbe Tabelle immer zusammengruppiert werden usw. (auch wenn das bei dir schon der Fall ist ist das keine Garantie, dass die Reihenfolge so bleibt)

Der Entitymanager hat eine flush-Methode, um die bisher gespeicherten Sachen zur DB zu schicken. Ein Aufruf zwischen deinen zwei Inserts sollte das Problem hier lösen.

(Bleibt natürlich auch die Frage, warum man fixe Keys angibt, statt AUTO_INCREMENT oÄ. zu verwenden)
 

Neue Beiträge

Zurück