一、只讀事物
也許有人要問一個select算不算一個事物。其實在innodb中一個innodb的select是一個事物,他有trx_t結構體,并且放到了mysql_trx_list鏈表中,關于
innodb事物系統一級的事都做了,但是這種事物叫做只讀事物
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. */
在實際的使用中他沒有自己的鎖結構也沒有自己的undo segment,這一點很好理解因為這個操作
始終是非鎖定的,至少在innodb一級是這樣(lock0lock.cc lock_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做好事物結構的準備工作,我們來看一
下關于源碼中重點的部分