• ADADADADAD

    MYSQL innodb中的只读事物以及事物id的分配方式[ mysql数据库 ]

    mysql数据库 时间:2024-12-03 12:12:15

    作者:文/会员上传

    简介:

    原创水平有限,如果有误请指出


    一、只读事物
    也许有人要问一个select算不算一个事物。其实在innodb中一个innodb的select是一个事物,他有trx_t结构体,并且放到了mysql_trx_lis

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    原创水平有限,如果有误请指出


    一、只读事物
    也许有人要问一个select算不算一个事物。其实在innodb中一个innodb的select是一个事物,他有trx_t结构体,并且放到了mysql_trx_list链表中,关于
    innodb事物系统一级的事都做了,但是这种事物叫做只读事物
    boolread_only;/*!< true if transaction is flagged
    as a READ-ONLY transaction.
    if auto_commit && will_lock == 0
    then it will be handled as a
    AC-NL-RO-SELECT (Auto Commit Non-Locking
    Read Only Select). A read only
    transaction will not be assigned an
    UNDO log. */
    在实际的使用中他没有自己的锁结构也没有自己的undo segment,这一点很好理解因为这个操作
    始终是非锁定的,至少在innodb一级是这样(lock0lock.cclock_table 都没调用),但是在MYSQL中,我们会发现实际上select语句也会
    获得MDL LOCK。(再次声明这里只是说innodb select没有表级别锁存在,但是MYSQL上层会有MDL LOCK)
    对于只读事物源码注释给出的流程如下:
    Auto-commit non-locking read-only:
    * NOT_STARTED -> ACTIVE -> NOT_STARTED
    而我们一般的2pc TRX流程如下:
    XA (2PC):
    * NOT_STARTED -> ACTIVE -> PREPARED -> COMMITTED -> NOT_STARTED
    可以看到他实际上就是没有commit的步骤,没有undo reodo这些当然是不需要的。但是不可否认它是一个事物
    另外当需要一个事物的时候在现在innodb版本中调用如下:
    trx_allocate_for_mysql --> trx_allocate_for_background --> trx_create_low
    这里涉及到一个innodb 事物池的概念,trx_create_low 从事物池中取出一个事物TRX_T结构体指针给调用者
    这个步骤完成后事物处于NOT_STARTED阶段,这个时候TRX_T结构各种属性都处于初始化阶段,为什么要说一下
    事物池的概念因为后面说事物号分配的时候会用到这个概念。
    然后根据调用者的需求适时激活事物。实际上会调用,而调用会通过
    trx_start_if_not_started_low->trx_start_low完成,在trx_start_low做好事物结构的准备工作,我们来看一
    下关于源码中重点的部分


    Optimizing InnoDB Read-Only Transactions我就不在说明什么了。


    作者微信:




    MYSQL innodb中的只读事物以及事物id的分配方式.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysqlid中的