Deadlockdetecktion and "tab_share" locks resulting from foreign keys...
 
Below a little example how easy it is to produce a deadlock:

Table and Data structure:
------------------------------------------------------------------

/*
     PARENT
      |  |
      |  |
 CHILD1  CHILD2

*/



DROP TABLE CHILD1;
DROP TABLE CHILD2;
DROP TABLE PARENT;

CREATE TABLE PARENT(
        P       INTEGER PRIMARY KEY
);

CREATE TABLE CHILD1(
        P               INTEGER NOT NULL,
        C1              INTEGER PRIMARY KEY,
        DATA            INTEGER,
        CONSTRAINT      FK_1 FOREIGN KEY(P) REFERENCES PARENT(P) ON DELETE CASCADE
);

CREATE TABLE CHILD2(
        P               INTEGER NOT NULL,
        C2              INTEGER PRIMARY KEY,
        DATA            INTEGER,
        CONSTRAINT      FK_2 FOREIGN KEY(P) REFERENCES PARENT(P) ON DELETE CASCADE
);


INSERT INTO PARENT VALUES(1);
INSERT INTO PARENT VALUES(2);

INSERT INTO CHILD1 VALUES(1,10,-1);

INSERT INTO CHILD2 VALUES(1,20,-2);

SELECT * FROM PARENT;
SELECT * FROM CHILD1;
SELECT * FROM CHILD2;

commit;

###########################################################################################

  No deadlock occurs in this scenario:

      Transaction 1:                         |     Transaction 2:
  ---------------------------------------------------------------------------------
  (1) UPDATE CHILD1 SET DATA=111 WHERE P=1;  |
  (2)                                        |     DELETE FROM PARENT WHERE P=2;
  (3) UPDATE CHILD2 SET DATA=222 WHERE P=1;  |




###########################################################################################

  DEADLOCK OCCURS IN THIS SCENARIO:  (1) and (3) are exchanged

      Transaction T1:                        |     Transaction T2:
  ---------------------------------------------------------------------------------
  (1) UPDATE CHILD2 SET DATA=111 WHERE P=1;  |
  (2)                                        |     DELETE FROM PARENT WHERE P=2;
  (3) UPDATE CHILD1 SET DATA=222 WHERE P=1;  |

  DEADLOCK!!!

  Cause:
    After (1), T1 holds a "row_exclusive" lock on CHILD2.
    When T2 gets called with (2) it has to check the referential 
    integrity and creates "temp" "tab_share" Locks, first on CHILD1 and 
    then on CHILD2. (Create order of the Foreign Keys FK_1 and FK_2 ???).
    But Child 2 is (row_exclusive) Locked by T1, so T2 has to wait.
    Now T1 calls the Update of CHILD1 (3). T1 has to wait until T2 releases 
    the "tab_share" lock on CHILD1.

    -> T1 waits for a row_exclusive lock on CHILD1.
    -> T2 waits for a tab_share     lock on CHILD2.
    -> DEADLOCK

The real Problem:

  a) The automatic DEADLOCKDETECTION does not detect this DEADLOCK.
  b) T2 should set the "temp" "tab_share" locks all at once or none at all.
     (I do not really know if this is possible)

Questions:

- Is there any possibility to adjust Deadlockdetection 
  to detect "tab_share" DEADLOCKS?
- Is there a workaround, like
  DELETE FROM PARENT WHERE P=2 WITH LOCK OPTION NOWAIT; ???


The problem for us is: 

  How to ensure consistent data in a large application 
  using maxdb with many many tables and many many foreign keys,
  when we have many many deadlocks resulting of the 
  consistency features.
    I know that it is possible to change the order of the 
  SQL Statements in our application. But the problem is 
  that we have complex data structures, and it would be very
  hard (nearly impossible) to find all critical parts in the program
  code, which could end up in a deadlock as described.




P.S.: how is this problem in other databases solved? (oracle,..)


greetings and thank you very much in advance,

Andre'
   
-- 
__________________________________________________________________________

Als Technologieunternehmen konzipieren und entwickeln wir maßgeschneiderte Feedback- 
und
Monitoring-Systeme - wie beispielsweise Lösungen für Beschwerde- und Ideenmanagement.
Mit dem Inquery® Survey Server bieten wir eine der leistungsfähigsten Standardlösungen 
für
Online-Umfragen mit dem Schwerpunkt auf der Messung von Kundenzufriedenheit an.
__________________________________________________________________________


Inworks GmbH
Andre Reitz, Leiter Entwicklung
Hörvelsinger Weg 39, 89081 Ulm, Germany
Tel +49 (0) 731 / 93807-21
Fax +49(0)731/93807-18
Internet: http://www.inworks.de



--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to