This is part of the ongoing work on improving the transaction
life cycle management. In 5.7.2 we split the transaction list
into two. The read-only transaction list and the read-write
transaction list. There was another "virtual" list, the
auto-commit non-locking read-only (AC-NL-RO) transaction
list. The change in 5.7.2 was that by default a transaction was
treated as read only and added to the read-only transaction list.
Only when it was determined that the transaction was going to do
an update we removed the transaction from the read-only list and
moved it to the read-write transaction list. This initial add to
the the read-only list forced the acquisition of the
trx_sys_t::mutex. Acquiring the mutex during transaction
start/begin has a cost. Promoting a transaction from read-only to
read-write we had to acquire the trx_sys_t::mutex to add to the
read-write transaction list and so that is not too expensive and
unavoidable. There is another transaction list for caching user
transactions that we will ignore in this discussion (the
mysql-trx-list) it is per connection. All user transactions both
AC-NL-RO, plain read-only and read-write user transactions are on
this list.
The optimization
The optimization in 5.7.3 is to eliminate the explicit read-only
transaction list altogether. By default transactions are not put
on any list unless they are explicitly tagged as read-write then
they are added to the read-write transaction list. This makes the
transaction begin mutex free. Additionally if the transaction
commits as a read-only transaction then we don't need to acquire
the trx_sys_t::mutex at commit time to remove from the read-only
list either. This improves performance for read-only
transactions, making them more or less equivalent to AC-NL-RO
transactions. They will however incur some cost compared to
AC-NL-RO transactions if they acquire shared locks.
Additionally, the MVCC view open/close handling of
read-only transactions is now equivalent to that of AC-NL-RO
transactions, very low life cycle overhead. This will also help
in improving performance significantly.
User impact
There is of course the positive performance impact but there is
also a change in visibility semantics. With the elimination of
the read-only list the read-only transactions are now no longer
visible via SHOW ENGINE INNODB STATUS; they are however visible
via the INFORMATION SCHEMA.
Jan
11
2014