一、只讀事物
也許有人要問一個(gè)select算不算一個(gè)事物。其實(shí)在innodb中一個(gè)innodb的select是一個(gè)事物,他有trx_t結(jié)構(gòu)體,并且放到了mysql_trx_list鏈表中,關(guān)于
innodb事物系統(tǒng)一級(jí)的事都做了,但是這種事物叫做只讀事物
bool read_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. */
在實(shí)際的使用中他沒有自己的鎖結(jié)構(gòu)也沒有自己的undo segment,這一點(diǎn)很好理解因?yàn)檫@個(gè)操作
始終是非鎖定的,至少在innodb一級(jí)是這樣(lock0lock.cc lock_table 都沒調(diào)用),但是在MYSQL中,我們會(huì)發(fā)現(xiàn)實(shí)際上select語句也會(huì)
獲得MDL LOCK。(再次聲明這里只是說innodb select沒有表級(jí)別鎖存在,但是MYSQL上層會(huì)有MDL LOCK)
對(duì)于只讀事物源碼注釋給出的流程如下:
Auto-commit non-locking read-only:
* NOT_STARTED -> ACTIVE -> NOT_STARTED
而我們一般的2pc TRX流程如下:
XA (2PC):
* NOT_STARTED -> ACTIVE -> PREPARED -> COMMITTED -> NOT_STARTED
可以看到他實(shí)際上就是沒有commit的步驟,沒有undo reodo這些當(dāng)然是不需要的。但是不可否認(rèn)它是一個(gè)事物
另外當(dāng)需要一個(gè)事物的時(shí)候在現(xiàn)在innodb版本中調(diào)用如下:
trx_allocate_for_mysql --> trx_allocate_for_background --> trx_create_low
這里涉及到一個(gè)innodb 事物池的概念,trx_create_low 從事物池中取出一個(gè)事物TRX_T結(jié)構(gòu)體指針給調(diào)用者
這個(gè)步驟完成后事物處于NOT_STARTED階段,這個(gè)時(shí)候TRX_T結(jié)構(gòu)各種屬性都處于初始化階段,為什么要說一下
事物池的概念因?yàn)楹竺嬲f事物號(hào)分配的時(shí)候會(huì)用到這個(gè)概念。
然后根據(jù)調(diào)用者的需求適時(shí)激活事物。實(shí)際上會(huì)調(diào)用,而調(diào)用會(huì)通過
trx_start_if_not_started_low->trx_start_low完成,在trx_start_low做好事物結(jié)構(gòu)的準(zhǔn)備工作,我們來看一
下關(guān)于源碼中重點(diǎn)的部分