row0vers.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Row versions
  3. (c) 1997 Innobase Oy
  4. Created 2/6/1997 Heikki Tuuri
  5. *******************************************************/
  6. #include "row0row.h"
  7. #include "dict0dict.h"
  8. #include "read0read.h"
  9. #include "page0page.h"
  10. #include "log0recv.h"
  11. /*************************************************************************
  12. Fetches the trx id of a clustered index record or version. */
  13. UNIV_INLINE
  14. dulint
  15. row_vers_get_trx_id(
  16. /*================*/
  17. /* out: trx id or ut_dulint_zero if the
  18. clustered index record not found */
  19. rec_t* rec, /* in: clustered index record, or an old
  20. version of it */
  21. dict_table_t* table) /* in: table */
  22. {
  23. return(row_get_rec_trx_id(rec, dict_table_get_first_index(table)));
  24. }
  25. /*************************************************************************
  26. Checks if a consistent read can be performed immediately on the index
  27. record, or if an older version is needed. */
  28. UNIV_INLINE
  29. ibool
  30. row_vers_clust_rec_sees_older(
  31. /*==========================*/
  32. /* out: FALSE if can read immediately */
  33. rec_t* rec, /* in: record which should be read or passed
  34. over by a read cursor */
  35. dict_index_t* index, /* in: clustered index */
  36. read_view_t* view) /* in: read view */
  37. {
  38. ut_ad(index->type & DICT_CLUSTERED);
  39. if (read_view_sees_trx_id(view, row_get_rec_trx_id(rec, index))) {
  40. return(FALSE);
  41. }
  42. return(TRUE);
  43. }
  44. /*************************************************************************
  45. Checks if a secondary index record can be read immediately by a consistent
  46. read, or if an older version may be needed. To be sure, we will have to
  47. look in the clustered index. */
  48. UNIV_INLINE
  49. ibool
  50. row_vers_sec_rec_may_see_older(
  51. /*===========================*/
  52. /* out: FALSE if can be read immediately */
  53. rec_t* rec, /* in: record which should be read or passed */
  54. dict_index_t* index __attribute__((unused)),/* in: secondary index */
  55. read_view_t* view) /* in: read view */
  56. {
  57. page_t* page;
  58. ut_ad(!(index->type & DICT_CLUSTERED));
  59. page = buf_frame_align(rec);
  60. if ((ut_dulint_cmp(page_get_max_trx_id(page), view->up_limit_id) >= 0)
  61.     || recv_recovery_is_on()) {
  62. /* It may be that the record was inserted or modified by a
  63. transaction the view should not see: we have to look in the
  64. clustered index */
  65. return(TRUE);
  66. }
  67. return(FALSE);
  68. }