home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / database / ingres / 1007 < prev    next >
Encoding:
Internet Message Format  |  1992-07-27  |  5.4 KB

  1. Path: sparky!uunet!dtix!darwin.sura.net!gatech!asuvax!ncar!uchinews!gsbacd.uchicago.edu!cs_mj
  2. From: cs_mj@gsbacd.uchicago.edu (Mark Jaeger)
  3. Newsgroups: comp.databases.ingres
  4. Subject: Re: How must I handle deadlocks in ESQL?
  5. Message-ID: <1992Jul27.130746.1@gsbacd.uchicago.edu>
  6. Date: 27 Jul 92 19:07:46 GMT
  7. References: <847@felix.Sublink.Org>
  8. Sender: news@uchinews.uchicago.edu (News System)
  9. Lines: 101
  10.  
  11. In article <847@felix.Sublink.Org>, eb@felix.Sublink.Org 
  12. (Enrico Badella) writes:
  13. > I admit I'm no RDBMS expert. I'm currently using Ingres 6.2 that used
  14. > to be bundle with SCO-ODT on a 33Mhz 386 clone.
  15. > My application must handle spikes of incomming data and apparently under
  16. > heavy load some DEADLOCK messages appear in errlog.log.
  17. > In my application I used this simple code to handle RDBMS errors
  18. >     EXEC SQL ......
  19. >     if (sqlca.code < 0)
  20. >         error
  21. > The Ingres ESQL User's Guide shows some examples of deadlock handling
  22. > in transactions and suggests the following code
  23. >     start:
  24. >     EXEC SQL ......
  25. >     if ((sqlca.sqlcode == DEADLOCK) || (sqlca.code == FORCEABORT))
  26. >         goto start;
  27. >     if (sqlca.code < 0)
  28. >         error
  29. > At this point I have 2 questions:
  30. > 1) won't the immediate rexecution of the SQL statement incurr in another
  31. >    deadlock or create a worst condition of load on the RDBMS? Before
  32. >    restarting the SQL statement would it be a good idea of sleeping for
  33. >    1 or 2 seconds?
  34.  
  35. If the error that you have encountered is truly deadlock, then the hope
  36. is that the other transaction that caused the deadlock will now be able
  37. to proceed and commit, thereby releasing its locks.  The process whose
  38. transaction got aborted will have to wait to acquire its locks until the
  39. other process has finished committing.  Since the locks have to be
  40. acquired before the server starts executing the query (in QEF), this
  41. shouldn't create too big a load on the server, apart from the overhead
  42. of the deadlock search and the rollback that the deadlock caused.  This
  43. isn't a problem if it occurs rarely.  If it's frequent, then it's a
  44. heavy overhead on the server to do all that nonproductive work.
  45.  
  46. It certainly shouldn't hurt to sleep briefly, although another process
  47. might get in in the meantime, and the process that slept might have to
  48. wait longer than it should.
  49.  
  50. According to Derek Wright, one of the principal consultants for Ingres,
  51. it's not a good idea to retry endlessly, as the code above implies.  In
  52. his words, if lightning strikes twice in the same place, it's better to
  53. move on.  In other words, if you get deadlocking under heavy concurrent
  54. update situations, it's best to examine your table and transaction
  55. design to find out why it is occurring.  If I see deadlocks more than a
  56. few times a day (they're reported in errlog.log), then I start to worry.
  57.  
  58. > 2) I wasn't able to try the code because I didn't find the value of the
  59. >    two constants DEADLOCK and FORCEABORT in the manuals or include files.
  60. >    Apparently DEADLOCK is #defined as -4700 but I'm not sure; I just
  61. >    printed the value of sqlca.code.
  62.  
  63. I believe that there are three SQLCODE's that can be returned to the
  64. front end that represent "deadlock" (actually, retry situations). 
  65. Actually, only one of them is truly deadlock, and that's the -4700 you
  66. cite.  Another is -4706, which is a log full error.  The third is -4708,
  67. but I still don't know what this is, and I wasn't able to find anyone
  68. from Ingres at the NAIUA in May who could tell me what it is. 
  69.  
  70. You would probably do well to get a later version of INGRES.  At some
  71. point (release 6.3?), they introduced generic errors.  I recommend using
  72. them.  All of the above errors map to a generic "serialization" error,
  73. which means that the server couldn't execute the given query in a way
  74. that would make the set of all queries thrown at it serializable.  I.e.,
  75. it could only get part way through the given transaction, and then it
  76. had to back out in order to proceed.  As I mentioned, this can be caused
  77. by deadlock or by log full.  
  78.  
  79. The various error codes are defined in ii_config:generr.h, which is
  80. probably the best place to get them from.  It's better to test the
  81. generic error, so that all of the three situations (-4700, -4706, and
  82. -4708) get treated the same way.  Also, when Ingres introduces a _new_
  83. serialization error (which they did with release 6), then your code will
  84. continue to work without change, after recompiling.
  85.  
  86. Log file full can be caused by a log file that is too small, or by
  87. transactions that are too big, or by one transaction that took too long
  88. to get committed.
  89.  
  90. Deadlock can be caused by a variety of problems.  Index overflow is one
  91. of them (look for overflow pages in the iitables system catalog, or
  92. non-btree tables with heavy inserts).  Modifying to btree might help to
  93. avoid this.  Another cause is lock escalation (look in the errlog.log
  94. file for indications of this).  To solve this, try setting the lockmode
  95. to "level=table".  Another general rule is to know your transactions and
  96. always access tables that are being updated in the same order (e.g.,
  97. alphabetically).
  98.  
  99. All of above is really oversimplified.  To really solve the problem,
  100. you'll have to take a close look at where the deadlocks are coming from.
  101.  
  102. --Mark Jaeger                internet: cs_mj@gsbvax.uchicago.edu
  103. Graduate School of Business        yellnet:  (312) 702-0328
  104. University of Chicago            faxnet:   (312) 702-0233
  105. Disclaimer: My opinions are my own and not those of my employer.
  106. Ich bin ein Virus.  Mach' mit und kopiere mich in Deine .signature.
  107.