lock0lock.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:19k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The transaction lock system
  3. (c) 1996 Innobase Oy
  4. Created 5/7/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef lock0lock_h
  7. #define lock0lock_h
  8. #include "univ.i"
  9. #include "trx0types.h"
  10. #include "rem0types.h"
  11. #include "dict0types.h"
  12. #include "que0types.h"
  13. #include "page0types.h"
  14. #include "lock0types.h"
  15. #include "read0types.h"
  16. #include "hash0hash.h"
  17. extern ibool lock_print_waits;
  18. /*****************************************************************
  19. Cancels a waiting record lock request and releases the waiting transaction
  20. that requested it. NOTE: does NOT check if waiting lock requests behind this
  21. one can now be granted! */
  22. void
  23. lock_rec_cancel(
  24. /*============*/
  25. lock_t* lock); /* in: waiting record lock request */
  26. /*************************************************************************
  27. Creates the lock system at database start. */
  28. void
  29. lock_sys_create(
  30. /*============*/
  31. ulint n_cells); /* in: number of slots in lock hash table */
  32. /*************************************************************************
  33. Checks if some transaction has an implicit x-lock on a record in a secondary
  34. index. */
  35. trx_t*
  36. lock_sec_rec_some_has_impl_off_kernel(
  37. /*==================================*/
  38. /* out: transaction which has the x-lock, or
  39. NULL */
  40. rec_t* rec, /* in: user record */
  41. dict_index_t* index); /* in: secondary index */
  42. /*************************************************************************
  43. Checks if some transaction has an implicit x-lock on a record in a clustered
  44. index. */
  45. UNIV_INLINE
  46. trx_t*
  47. lock_clust_rec_some_has_impl(
  48. /*=========================*/
  49. /* out: transaction which has the x-lock, or
  50. NULL */
  51. rec_t* rec, /* in: user record */
  52. dict_index_t* index); /* in: clustered index */
  53. /*****************************************************************
  54. Resets the lock bits for a single record. Releases transactions
  55. waiting for lock requests here. */
  56. void
  57. lock_rec_reset_and_release_wait(
  58. /*============================*/
  59. rec_t* rec); /* in: record whose locks bits should be reset */
  60. /*****************************************************************
  61. Makes a record to inherit the locks of another record as gap type
  62. locks, but does not reset the lock bits of the other record. Also
  63. waiting lock requests on rec are inherited as GRANTED gap locks. */
  64. void
  65. lock_rec_inherit_to_gap(
  66. /*====================*/
  67. rec_t* heir, /* in: record which inherits */
  68. rec_t* rec); /* in: record from which inherited; does NOT reset
  69. the locks on this record */
  70. /*****************************************************************
  71. Updates the lock table when we have reorganized a page. NOTE: we copy
  72. also the locks set on the infimum of the page; the infimum may carry
  73. locks if an update of a record is occurring on the page, and its locks
  74. were temporarily stored on the infimum. */
  75. void
  76. lock_move_reorganize_page(
  77. /*======================*/
  78. page_t* page, /* in: old index page */
  79. page_t* new_page); /* in: reorganized page */
  80. /*****************************************************************
  81. Moves the explicit locks on user records to another page if a record
  82. list end is moved to another page. */
  83. void
  84. lock_move_rec_list_end(
  85. /*===================*/
  86. page_t* new_page, /* in: index page to move to */
  87. page_t* page, /* in: index page */
  88. rec_t* rec); /* in: record on page: this is the
  89. first record moved */
  90. /*****************************************************************
  91. Moves the explicit locks on user records to another page if a record
  92. list start is moved to another page. */
  93. void
  94. lock_move_rec_list_start(
  95. /*=====================*/
  96. page_t* new_page, /* in: index page to move to */
  97. page_t* page, /* in: index page */
  98. rec_t* rec, /* in: record on page: this is the
  99. first record NOT copied */
  100. rec_t* old_end); /* in: old previous-to-last record on
  101. new_page before the records were copied */
  102. /*****************************************************************
  103. Updates the lock table when a page is split to the right. */
  104. void
  105. lock_update_split_right(
  106. /*====================*/
  107. page_t* right_page, /* in: right page */
  108. page_t* left_page); /* in: left page */
  109. /*****************************************************************
  110. Updates the lock table when a page is merged to the right. */
  111. void
  112. lock_update_merge_right(
  113. /*====================*/
  114. rec_t* orig_succ, /* in: original successor of infimum
  115. on the right page before merge */
  116. page_t* left_page); /* in: merged index page which will be
  117. discarded */
  118. /*****************************************************************
  119. Updates the lock table when the root page is copied to another in
  120. btr_root_raise_and_insert. Note that we leave lock structs on the
  121. root page, even though they do not make sense on other than leaf
  122. pages: the reason is that in a pessimistic update the infimum record
  123. of the root page will act as a dummy carrier of the locks of the record
  124. to be updated. */
  125. void
  126. lock_update_root_raise(
  127. /*===================*/
  128. page_t* new_page, /* in: index page to which copied */
  129. page_t* root); /* in: root page */
  130. /*****************************************************************
  131. Updates the lock table when a page is copied to another and the original page
  132. is removed from the chain of leaf pages, except if page is the root! */
  133. void
  134. lock_update_copy_and_discard(
  135. /*=========================*/
  136. page_t* new_page, /* in: index page to which copied */
  137. page_t* page); /* in: index page; NOT the root! */
  138. /*****************************************************************
  139. Updates the lock table when a page is split to the left. */
  140. void
  141. lock_update_split_left(
  142. /*===================*/
  143. page_t* right_page, /* in: right page */
  144. page_t* left_page); /* in: left page */
  145. /*****************************************************************
  146. Updates the lock table when a page is merged to the left. */
  147. void
  148. lock_update_merge_left(
  149. /*===================*/
  150. page_t* left_page, /* in: left page to which merged */
  151. rec_t* orig_pred, /* in: original predecessor of supremum
  152. on the left page before merge */
  153. page_t* right_page); /* in: merged index page which will be
  154. discarded */
  155. /*****************************************************************
  156. Resets the original locks on heir and replaces them with gap type locks
  157. inherited from rec. */
  158. void
  159. lock_rec_reset_and_inherit_gap_locks(
  160. /*=================================*/
  161. rec_t* heir, /* in: heir record */
  162. rec_t* rec); /* in: record */
  163. /*****************************************************************
  164. Updates the lock table when a page is discarded. */
  165. void
  166. lock_update_discard(
  167. /*================*/
  168. rec_t* heir, /* in: record which will inherit the locks */
  169. page_t* page); /* in: index page which will be discarded */
  170. /*****************************************************************
  171. Updates the lock table when a new user record is inserted. */
  172. void
  173. lock_update_insert(
  174. /*===============*/
  175. rec_t* rec); /* in: the inserted record */
  176. /*****************************************************************
  177. Updates the lock table when a record is removed. */
  178. void
  179. lock_update_delete(
  180. /*===============*/
  181. rec_t* rec); /* in: the record to be removed */
  182. /*************************************************************************
  183. Stores on the page infimum record the explicit locks of another record.
  184. This function is used to store the lock state of a record when it is
  185. updated and the size of the record changes in the update. The record
  186. is in such an update moved, perhaps to another page. The infimum record
  187. acts as a dummy carrier record, taking care of lock releases while the
  188. actual record is being moved. */
  189. void
  190. lock_rec_store_on_page_infimum(
  191. /*===========================*/
  192. rec_t* rec); /* in: record whose lock state is stored
  193. on the infimum record of the same page; lock
  194. bits are reset on the record */
  195. /*************************************************************************
  196. Restores the state of explicit lock requests on a single record, where the
  197. state was stored on the infimum of the page. */
  198. void
  199. lock_rec_restore_from_page_infimum(
  200. /*===============================*/
  201. rec_t* rec, /* in: record whose lock state is restored */
  202. page_t* page); /* in: page (rec is not necessarily on this page)
  203. whose infimum stored the lock state; lock bits are
  204. reset on the infimum */ 
  205. /*************************************************************************
  206. Returns TRUE if there are explicit record locks on a page. */
  207. ibool
  208. lock_rec_expl_exist_on_page(
  209. /*========================*/
  210. /* out: TRUE if there are explicit record locks on
  211. the page */
  212. ulint space, /* in: space id */
  213. ulint page_no);/* in: page number */
  214. /*************************************************************************
  215. Checks if locks of other transactions prevent an immediate insert of
  216. a record. If they do, first tests if the query thread should anyway
  217. be suspended for some reason; if not, then puts the transaction and
  218. the query thread to the lock wait state and inserts a waiting request
  219. for a gap x-lock to the lock queue. */
  220. ulint
  221. lock_rec_insert_check_and_lock(
  222. /*===========================*/
  223. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  224. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  225. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  226. does nothing */
  227. rec_t* rec, /* in: record after which to insert */
  228. dict_index_t* index, /* in: index */
  229. que_thr_t* thr, /* in: query thread */
  230. ibool* inherit);/* out: set to TRUE if the new inserted
  231. record maybe should inherit LOCK_GAP type
  232. locks from the successor record */
  233. /*************************************************************************
  234. Checks if locks of other transactions prevent an immediate modify (update,
  235. delete mark, or delete unmark) of a clustered index record. If they do,
  236. first tests if the query thread should anyway be suspended for some
  237. reason; if not, then puts the transaction and the query thread to the
  238. lock wait state and inserts a waiting request for a record x-lock to the
  239. lock queue. */
  240. ulint
  241. lock_clust_rec_modify_check_and_lock(
  242. /*=================================*/
  243. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  244. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  245. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  246. does nothing */
  247. rec_t* rec, /* in: record which should be modified */
  248. dict_index_t* index, /* in: clustered index */
  249. que_thr_t* thr); /* in: query thread */
  250. /*************************************************************************
  251. Checks if locks of other transactions prevent an immediate modify
  252. (delete mark or delete unmark) of a secondary index record. */
  253. ulint
  254. lock_sec_rec_modify_check_and_lock(
  255. /*===============================*/
  256. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  257. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  258. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  259. does nothing */
  260. rec_t* rec, /* in: record which should be modified;
  261. NOTE: as this is a secondary index, we
  262. always have to modify the clustered index
  263. record first: see the comment below */
  264. dict_index_t* index, /* in: secondary index */
  265. que_thr_t* thr); /* in: query thread */
  266. /*************************************************************************
  267. Checks if locks of other transactions prevent an immediate read, or passing
  268. over by a read cursor, of a clustered index record. If they do, first tests
  269. if the query thread should anyway be suspended for some reason; if not, then
  270. puts the transaction and the query thread to the lock wait state and inserts a
  271. waiting request for a record lock to the lock queue. Sets the requested mode
  272. lock on the record. */
  273. ulint
  274. lock_clust_rec_read_check_and_lock(
  275. /*===============================*/
  276. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  277. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  278. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  279. does nothing */
  280. rec_t* rec, /* in: user record or page supremum record
  281. which should be read or passed over by a read
  282. cursor */
  283. dict_index_t* index, /* in: clustered index */
  284. ulint mode, /* in: mode of the lock which the read cursor
  285. should set on records: LOCK_S or LOCK_X; the
  286. latter is possible in SELECT FOR UPDATE */
  287. que_thr_t* thr); /* in: query thread */
  288. /*************************************************************************
  289. Like the counterpart for a clustered index above, but now we read a
  290. secondary index record. */
  291. ulint
  292. lock_sec_rec_read_check_and_lock(
  293. /*=============================*/
  294. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  295. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  296. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  297. does nothing */
  298. rec_t* rec, /* in: user record or page supremum record
  299. which should be read or passed over by a read
  300. cursor */
  301. dict_index_t* index, /* in: secondary index */
  302. ulint mode, /* in: mode of the lock which the read cursor
  303. should set on records: LOCK_S or LOCK_X; the
  304. latter is possible in SELECT FOR UPDATE */
  305. que_thr_t* thr); /* in: query thread */
  306. /*************************************************************************
  307. Checks that a record is seen in a consistent read. */
  308. ibool
  309. lock_clust_rec_cons_read_sees(
  310. /*==========================*/
  311. /* out: TRUE if sees, or FALSE if an earlier
  312. version of the record should be retrieved */
  313. rec_t* rec, /* in: user record which should be read or
  314. passed over by a read cursor */
  315. dict_index_t* index, /* in: clustered index */
  316. read_view_t* view); /* in: consistent read view */
  317. /*************************************************************************
  318. Checks that a non-clustered index record is seen in a consistent read. */
  319. ulint
  320. lock_sec_rec_cons_read_sees(
  321. /*========================*/
  322. /* out: TRUE if certainly sees, or FALSE if an
  323. earlier version of the clustered index record
  324. might be needed: NOTE that a non-clustered
  325. index page contains so little information on
  326. its modifications that also in the case FALSE,
  327. the present version of rec may be the right,
  328. but we must check this from the clustered
  329. index record */
  330. rec_t* rec, /* in: user record which should be read or
  331. passed over by a read cursor */
  332. dict_index_t* index, /* in: non-clustered index */
  333. read_view_t* view); /* in: consistent read view */
  334. /*************************************************************************
  335. Locks the specified database table in the mode given. If the lock cannot
  336. be granted immediately, the query thread is put to wait. */
  337. ulint
  338. lock_table(
  339. /*=======*/
  340. /* out: DB_SUCCESS, DB_LOCK_WAIT,
  341. DB_DEADLOCK, or DB_QUE_THR_SUSPENDED */
  342. ulint flags, /* in: if BTR_NO_LOCKING_FLAG bit is set,
  343. does nothing */
  344. dict_table_t* table, /* in: database table in dictionary cache */
  345. ulint mode, /* in: lock mode */
  346. que_thr_t* thr); /* in: query thread */
  347. /*************************************************************************
  348. Checks if there are any locks set on the table. */
  349. ibool
  350. lock_is_on_table(
  351. /*=============*/
  352. /* out: TRUE if there are lock(s) */
  353. dict_table_t* table); /* in: database table in dictionary cache */
  354. /*************************************************************************
  355. Releases transaction locks, and releases possible other transactions waiting
  356. because of these locks. */
  357. void
  358. lock_release_off_kernel(
  359. /*====================*/
  360. trx_t* trx); /* in: transaction */
  361. /*************************************************************************
  362. Calculates the fold value of a page file address: used in inserting or
  363. searching for a lock in the hash table. */
  364. UNIV_INLINE
  365. ulint
  366. lock_rec_fold(
  367. /*===========*/
  368. /* out: folded value */
  369. ulint space, /* in: space */
  370. ulint page_no);/* in: page number */
  371. /*************************************************************************
  372. Calculates the hash value of a page file address: used in inserting or
  373. searching for a lock in the hash table. */
  374. UNIV_INLINE
  375. ulint
  376. lock_rec_hash(
  377. /*==========*/
  378. /* out: hashed value */
  379. ulint space, /* in: space */
  380. ulint page_no);/* in: page number */
  381. /*************************************************************************
  382. Gets the mutex protecting record locks on a given page address. */
  383. mutex_t*
  384. lock_rec_get_mutex_for_addr(
  385. /*========================*/
  386. ulint space, /* in: space id */
  387. ulint page_no);/* in: page number */
  388. /*************************************************************************
  389. Validates the lock queue on a single record. */
  390. ibool
  391. lock_rec_queue_validate(
  392. /*====================*/
  393. /* out: TRUE if ok */
  394. rec_t* rec, /* in: record to look at */
  395. dict_index_t* index); /* in: index, or NULL if not known */
  396. /*************************************************************************
  397. Prints info of a table lock. */
  398. void
  399. lock_table_print(
  400. /*=============*/
  401. lock_t* lock); /* in: table type lock */
  402. /*************************************************************************
  403. Prints info of a record lock. */
  404. void
  405. lock_rec_print(
  406. /*===========*/
  407. lock_t* lock); /* in: record type lock */
  408. /*************************************************************************
  409. Prints info of locks for all transactions. */
  410. void
  411. lock_print_info(void);
  412. /*=================*/
  413. /*************************************************************************
  414. Validates the lock queue on a table. */
  415. ibool
  416. lock_table_queue_validate(
  417. /*======================*/
  418. /* out: TRUE if ok */
  419. dict_table_t* table); /* in: table */
  420. /*************************************************************************
  421. Validates the record lock queues on a page. */
  422. ibool
  423. lock_rec_validate_page(
  424. /*===================*/
  425. /* out: TRUE if ok */
  426. ulint space, /* in: space id */
  427. ulint page_no);/* in: page number */
  428. /*************************************************************************
  429. Validates the lock system. */
  430. ibool
  431. lock_validate(void);
  432. /*===============*/
  433. /* out: TRUE if ok */
  434. /* The lock system */
  435. extern lock_sys_t* lock_sys;
  436. /* Lock modes and types */
  437. #define LOCK_NONE 0 /* this flag is used elsewhere to note
  438. consistent read */
  439. #define LOCK_IS 2 /* intention shared */
  440. #define LOCK_IX 3 /* intention exclusive */
  441. #define LOCK_S 4 /* shared */
  442. #define LOCK_X 5 /* exclusive */
  443. #define LOCK_MODE_MASK 0xF /* mask used to extract mode from the
  444. type_mode field in a lock */
  445. #define LOCK_TABLE 16 /* these type values should be so high that */
  446. #define LOCK_REC 32 /* they can be ORed to the lock mode */
  447. #define LOCK_TYPE_MASK 0xF0 /* mask used to extract lock type from the
  448. type_mode field in a lock */
  449. #define LOCK_WAIT 256 /* this wait bit should be so high that
  450. it can be ORed to the lock mode and type;
  451. when this bit is set, it means that the
  452. lock has not yet been granted, it is just
  453. waiting for its turn in the wait queue */
  454. #define LOCK_GAP 512 /* this gap bit should be so high that
  455. it can be ORed to the other flags;
  456. when this bit is set, it means that the
  457. lock holds only on the gap before the record;
  458. for instance, an x-lock on the gap does not
  459. give permission to modify the record on which
  460. the bit is set; locks of this type are created
  461. when records are removed from the index chain
  462. of records */
  463. /* When lock bits are reset, the following flags are available: */
  464. #define LOCK_RELEASE_WAIT 1
  465. #define LOCK_NOT_RELEASE_WAIT 2
  466. /* Lock operation struct */
  467. typedef struct lock_op_struct lock_op_t;
  468. struct lock_op_struct{
  469. dict_table_t* table; /* table to be locked */
  470. ulint mode; /* lock mode */
  471. };
  472. #define LOCK_OP_START 1
  473. #define LOCK_OP_COMPLETE 2
  474. /* The lock system struct */
  475. struct lock_sys_struct{
  476. hash_table_t* rec_hash; /* hash table of the record locks */
  477. };
  478. /* The lock system */
  479. extern lock_sys_t* lock_sys;
  480. #ifndef UNIV_NONINL
  481. #include "lock0lock.ic"
  482. #endif
  483. #endif