lock.l
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. ." This is -*-nroff-*-
  2. ." XXX standard disclaimer belongs here....
  3. ." $Header: /usr/local/cvsroot/pgsql/src/man/Attic/lock.l,v 1.9 1999/06/09 03:51:40 vadim Exp $
  4. .TH LOCK SQL 01/23/93 PostgreSQL PostgreSQL
  5. .SH NAME
  6. lock - Explicit lock of a table inside a transaction
  7. .SH SYNOPSIS
  8. .nf
  9. fBlockfR [fBtablefR] classname
  10. fBlockfR [fBtablefR] classname fBinfR [fBrowfR|fBaccessfR] {fBsharefR|fBexclusivefR} fBmodefR
  11. fBlockfR [fBtablefR] classname fBinfR fBshare row exclusivefR fBmodefR
  12. .fi
  13. .SH DESCRIPTION
  14. Available lock modes from least restrictive to most restrictive:
  15. .PP
  16. fBACCESS SHARE MODEfR
  17. fBNotefR: this lock mode is acquired automatically over tables being
  18. queried. fBPostgresfR releases automatically acquired
  19. ACCESS SHARE locks after statement is done.
  20. This is the least restrictive lock mode which conflicts with ACCESS EXCLUSIVE
  21. mode only. It's intended to protect table being queried from concurrent
  22. fBALTER TABLEfR, fBDROP TABLEfR and
  23. fBVACUUMfR statements over the same table.
  24. fBROW SHARE MODEfR
  25. fBNotefR: Automatically acquired by SELECT FOR UPDATE statement.
  26. Conflicts with EXCLUSIVE and ACCESS EXCLUSIVE lock modes.
  27. fBROW EXCLUSIVE MODEfR
  28. fBNotefR: Automatically acquired by UPDATE, DELETE, INSERT statements.
  29. Conflicts with SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE and ACCESS EXCLUSIVE
  30. modes. Generally means that a transaction updated/inserted some tuples in a
  31. table.
  32. fBSHARE MODEfR
  33. fBNotefR: Automatically acquired by CREATE INDEX statement.
  34. Conflicts with ROW EXCLUSIVE, SHARE ROW EXCLUSIVE, EXCLUSIVE and ACCESS
  35. EXCLUSIVE modes. This mode protects a table against concurrent updates.
  36. fBSHARE ROW EXCLUSIVE MODEfR
  37. Conflicts with ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE and
  38. ACCESS EXCLUSIVE modes. This mode is more restrictive than SHARE mode
  39. because of only one transaction at time can hold this lock.
  40. fBEXCLUSIVE MODEfR
  41. Conflicts with ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE,
  42. EXCLUSIVE and ACCESS EXCLUSIVE modes. This mode is yet more restrictive than
  43. SHARE ROW EXCLUSIVE one - it blocks concurrent SELECT FOR UPDATE queries.
  44. fBACCESS EXCLUSIVE MODEfR
  45. fBNotefR: Automatically acquired by ALTER TABLE, DROP TABLE, VACUUM
  46. statements.
  47. This is the most restrictive lock mode which conflicts with all other
  48. lock modes and protects locked table from any concurrent operations.
  49. fBNotefR: This lock mode is also acquired by first form of LOCK TABLE
  50. (i.e. without explicit lock mode option).
  51. .SH USAGE
  52. .BR Postgres
  53. always uses less restrictive lock modes ever possible. LOCK TABLE statement
  54. provided for cases when you might need in more restrictive locking.
  55. .PP
  56. For example, application run transaction at READ COMMITTED isolation level
  57. and need to ensure existance data in a table for duration of transaction. To
  58. achieve this you could use SHARE lock mode over table before querying. This
  59. will protect data from concurrent changes and provide your further read
  60. operations over table with data in their real current state, because of
  61. SHARE lock mode conflicts with ROW EXCLUSIVE one, acquired by writers, and
  62. your LOCK TABLE table IN SHARE MODE statement will wait untill concurrent
  63. write operations (if any) commit/rollback. (Note that to read data in their
  64. real current state running transaction at SERIALIZABLE isolation level you
  65. have to execute LOCK TABLE statement before execution any DML statement,
  66. when transaction defines what concurrent changes will be visible to
  67. herself).
  68. If, in addition to requirements above, transaction is going to change data
  69. in a table then SHARE ROW EXCLUSIVE lock mode should be acquired to prevent
  70. deadlock conditions when two concurrent transactions would lock table in
  71. SHARE mode and than would try to change data in this table, both
  72. (implicitly) acquiring ROW EXCLUSIVE lock mode that conflicts with
  73. concurrent SHARE lock.
  74.   
  75. Following deadlock issue (when two transaction wait one another)
  76. touched above, you should follow two general rules to prevent 
  77. deadlock conditions:
  78.   
  79. fB1. Transactions have to acquire locks on the same objects in the same order.fR
  80.    
  81. For example, if one application updates row R1 and than updates row R2 (in
  82. the same transaction) then second application shouldn't update row R2 if
  83. it's going update row R1 later (in single transaction).  Instead, it should
  84. update R1 and R2 rows in the same order as first application.
  85. fB2. Transactions should acquire two conflicting lock modes only if one of
  86. them is self-conflicting (i.e. may be held by one transaction at time only)
  87. and should acquire most restrictive mode first.fR
  88.    
  89. Example for this rule is described above when told about using
  90. SHARE ROW EXCLUSIVE mode instead of SHARE one.
  91. fBNotefR: fBPostgresfR does detect deadlocks and will rollback one of
  92. waiting transactions to resolve the deadlock.
  93. .SH COMPATIBILITY
  94. LOCK TABLE statement is a fBPostgresfR language extension.
  95. Except for ACCESS SHARE/EXCLUSIVE lock modes, all other fBPostgresfR lock
  96. modes and LOCK TABLE statement syntax are compatible with fBOraclefR
  97. ones.
  98. .SH EXAMPLES
  99. .nf
  100. --
  101. -- SHARE lock primary key table when going to perform
  102. -- insert into foreign key table.
  103. --
  104. BEGIN WORK;
  105. LOCK TABLE films IN SHARE MODE;
  106. SELECT id FROM films 
  107.   WHERE name = 'Star Wars: Episode I - The Phantom Menace';
  108. --
  109. -- Do ROLLBACK if record was not returned
  110. --
  111. INSERT INTO films_user_comments VALUES 
  112.   (_id_, 'GREAT! I was waiting it so long!');
  113. COMMIT WORK;
  114. --
  115. -- SHARE ROW EXCLUSIVE lock primary key table when going to perform
  116. -- delete operation.
  117. --
  118. BEGIN WORK;
  119. LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
  120. DELETE FROM films_user_comments WHERE id IN
  121.   (SELECT id FROM films WHERE rating < 5);
  122. DELETE FROM films WHERE rating < 5;
  123. COMMIT WORK;
  124. .SH "SEE ALSO"
  125. begin(l),
  126. commit(l),
  127. set(l),
  128. select(l).