Multi-версии управления параллелизмом MVCC достичь повторяемые чтения
ссылка
高性能 MySQL 第3版 1.4 多版本并发控制
MVCC реализован в виде снимка в определенный момент времени, сохраняя данные. MVCC различных реализаций различных механизмов хранения, как правило, оптимистичного параллелизма и пессимистическим управления параллелизмом.
InnoDB является MVCC для достижения
имя существительное
系统版本号
事务版本号
记录创建时间
记录删除时间
InnoDB MVCC скрыт храня два столбца, реализованных после каждой записи строки. Сохранить время, чтобы создать строку, удалить сохраненную временную линию. Конечно, не значение времени сохраняется, но номер версии системы. Каждый начать новую транзакцию, система автоматически увеличит номер версии. Транзакция системы номер версии номер версии времени начала операции.
Многократное чтение процесс выполнения MVCC
事务版本号是事务开始时刻的系统版本号
每开始一个新的事务,系统版本号都会自动递增
Выбрать
Возвращает запись выполняется условие
创建时间 <= 当前事务版本号 && ( 删除时间 == null || 删除时间 > 当前事务版本号 )
вставка
插入记录的创建时间 = 当前系统版本号
Созданная недавно вставленная запись устанавливаются на номер текущей версии системы, удалите время является недействительным.
удалять
被删除记录的删除时间 = 当前系统版本号
Удалить, чтобы удалить время записи устанавливаются на текущий номер версии системы, надгробную плиту, а может на самом деле не удалять данные.
Обновить
被更新记录的原记录的删除时间 = 当前系统版本号
新插入记录的创建时间 = 当前系统版本号
Время обновляется, чтобы удалить исходный набор записей в номер текущей версии системы, то есть логическое удаление исходной запись. Вставьте новый рекорд, который был создан для текущего номера версии системы.
MVCC читать только 2 уровня, работающие в изоляции читать совершенный и повторяемость, и другие уровни изоляции не используют этот механизм. прочитать незавершенные всегда читать последние строки данных, а не в соответствии с текущей версией транзакции ряда, seriablizable замок на все прочитанные строки.
MVCC источник разбор
http://www.ningoo.net/html/tag/mysql
http://blog.sina.com.cn/s/blog_4673e603010111ty.html
https://blog.csdn.net/joy0921/article/details/80128857
https://blog.csdn.net/u012919352/article/details/87984786
https://mp.weixin.qq.com/s?__biz=MzIxNTQ3NDMzMw==&mid=2247483670&idx=1&sn=751d84d0ce50d64934d636014abe2023&chksm=979688e4a0e101f2a51d1f06ec75e25c56f8936321ae43badc2fe9fc1257b4dc1c24223699de&scene=21#wechat_redirect
https://dev.mysql.com/doc/refman/5.5/en/innodb-consistent-read.html
https://blog.csdn.net/joy0921/article/details/80128857
Скрыть три поля
row_id db_trx_id db_roll_pt ID откат запись транзакции указатель ID
Во-первых, каждая строка данных, а также InnoDB откатить указатель DB_ROLL_PT для указывая на историю предыдущей версии модификации строки
- При вставке новой записи данных на соответствующий откат указателя NULL.
- Если текущая запись имеет первичный ключ, запись не генерируется ROW_ID
прочитать мнение отменить журнал
Определяется вид чтения строк виден
Конкретный процесс определения заключается в следующем:
Под уровнем изоляции RR, на время каждой операции началась, все активные транзакции будут копировать текущую систему в виде списка (чтения вид)
при уровне изоляции RC, когда в начале каждого оператора, будет текущая система Все активные операции на копию списка (читайте просмотр)
- «Тан Cheng -2016PG Ассамблея - мульти-база версии реализует инсайдер .pdf»
https://myslide.cn/slides/3542
MySQL · · ЬшоВВ исходный код анализ чтения зрения, сегменты отката и процесс продувки Введение https://yq.aliyun.com/articles/560506
mysql> show engine innodb status\G;
------------
TRANSACTIONS
------------
Trx id counter AC16
Purge done for trx's n:o < AC14 undo n:o < 0
History list length 1079
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION AC15, not started
MySQL thread id 4, OS thread handle 0x43c, query id 133 localhost 127.0.0.1 root
show engine innodb status
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G;
https://www.cnblogs.com/itcomputer/articles/5084611.html
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G;
*************************** 1. row ***************************
trx_id: AC16
trx_state: RUNNING
trx_started: 2019-08-03 11:50:27
trx_requested_lock_id: NULL
trx_wait_started: NULL
trx_weight: 0
trx_mysql_thread_id: 10
trx_query: NULL
trx_operation_state: NULL
trx_tables_in_use: 0
trx_tables_locked: 0
trx_lock_structs: 0
trx_lock_memory_bytes: 376
trx_rows_locked: 0
trx_rows_modified: 0
trx_concurrency_tickets: 0
trx_isolation_level: READ COMMITTED
trx_unique_checks: 1
trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
trx_adaptive_hash_latched: 0
trx_adaptive_hash_timeout: 10000
1 row in set (0.00 sec)
Я открыл две операции AC18 AC17, счетчик транзакций = AC19
mysql> show engine innodb status\G;
------------
TRANSACTIONS
------------
Trx id counter AC19
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G;
*************************** 1. row ***************************
trx_id: AC18
trx_state: RUNNING
trx_started: 2019-08-03 11:56:40
*************************** 2. row ***************************
trx_id: AC17
trx_state: RUNNING
trx_started: 2019-08-03 11:55:08
mysql> SELECT tx.trx_id
-> FROM information_schema.innodb_trx tx
-> WHERE tx.trx_mysql_thread_id = connection_id();
+--------+
| trx_id |
+--------+
| AC17 |
+--------+
1 row in set (0.07 sec)
mysql> SELECT tx.trx_id
-> FROM information_schema.innodb_trx tx
-> WHERE tx.trx_mysql_thread_id = connection_id();
+--------+
| trx_id |
+--------+
| AC18 |
+--------+
1 row in set (0.00 sec)
mysql> SELECT tx.trx_id
-> FROM information_schema.innodb_trx tx
-> WHERE tx.trx_mysql_thread_id = connection_id();
Empty set (0.00 sec)
https://www.jdon.com/51517
Уровень изоляции RR (кроме замка Gap) и RC различного уровня изоляции, чтобы создать снимок разницы во времени. Уровень изоляции RR в момент начала операции, скорее первое чтение чтение вида создания, уровень изоляции RC время начала создавать для чтения вида в заявлении.
Создание / чтение представления закрыто необходимо провести trx_sys-> мьютекс, ухудшать производительность системы, эта версия 5.7 оптимизирована, чтения вида, когда транзакция сессии будет кэшировать только для чтения транзакций.
Read view中保存的trx_sys状态主要包括
low_limit_id:high water mark,大于等于view->low_limit_id的事务对于view都是不可见的
up_limit_id:low water mark,小于view->up_limit_id的事务对于view一定是可见的
low_limit_no:trx_no小于view->low_limit_no的undo log对于view是可以purge的
rw_trx_ids:读写事务数组
Read view创建之后,读数据时比较记录最后更新的trx_id和view的 high/low water mark和读写事务数组即可判断可见性。
如前所述,如果记录最新数据是当前事务trx的更新结果,对应当前read view一定是可见的。
除此之外可以通过high/low water mark快速判断:
trx_id < view->up_limit_id的记录对于当前read view是一定可见的;
trx_id >= view->low_limit_id的记录对于当前read view是一定不可见的;
如果trx_id落在[up_limit_id, low_limit_id),需要在活跃读写事务数组查找trx_id是否存在,如果存在,记录对于当前read view是不可见的。
storage/innobase/read/read0read.c
http://blog.sina.com.cn/s/blog_4673e603010111ty.html
хранение / Innobase / включать / read0read.ic
view->n_trx_ids 数量
view->up_limit_id
view->low_limit_id
/*********************************************************************//**
Checks if a read view sees the specified transaction.
@return TRUE if sees */
UNIV_INLINE
ibool
read_view_sees_trx_id(
/*==================*/
const read_view_t* view, /*!< in: read view */
trx_id_t trx_id) /*!< in: trx id */
{
ulint n_ids;
ulint i;
if (trx_id < view->up_limit_id) {
return(TRUE);
}
if (trx_id >= view->low_limit_id) {
return(FALSE);
}
/* We go through the trx ids in the array smallest first: this order
may save CPU time, because if there was a very long running
transaction in the trx id array, its trx id is looked at first, and
the first two comparisons may well decide the visibility of trx_id. */
n_ids = view->n_trx_ids;
for (i = 0; i < n_ids; i++) {
trx_id_t view_trx_id
= read_view_get_nth_trx_id(view, n_ids - i - 1);
if (trx_id <= view_trx_id) {
return(trx_id != view_trx_id);
}
}
return(TRUE);
}
хранение / Innobase / включать / read0read.h
struct read_view_struct{
ulint type; /*!< VIEW_NORMAL, VIEW_HIGH_GRANULARITY */
undo_no_t undo_no;/*!< 0 or if type is
VIEW_HIGH_GRANULARITY
transaction undo_no when this high-granularity
consistent read view was created */
trx_id_t low_limit_no;
/*!< The view does not need to see the undo
logs for transactions whose transaction number
is strictly smaller (<) than this value: they
can be removed in purge if not needed by other
views */
trx_id_t low_limit_id;
/*!< The read should not see any transaction
with trx id >= this value. In other words,
this is the "high water mark". */
trx_id_t up_limit_id;
/*!< The read should see all trx ids which
are strictly smaller (<) than this value.
In other words,
this is the "low water mark". */
ulint n_trx_ids;
/*!< Number of cells in the trx_ids array */
trx_id_t* trx_ids;/*!< Additional trx ids which the read should
not see: typically, these are the active
transactions at the time when the read is
serialized, except the reading transaction
itself; the trx ids in this array are in a
descending order. These trx_ids should be
between the "low" and "high" water marks,
that is, up_limit_id and low_limit_id. */
trx_id_t creator_trx_id;
/*!< trx id of creating transaction, or
0 used in purge */
UT_LIST_NODE_T(read_view_t) view_list;
/*!< List of read views in trx_sys */
};
trx_id_t trx_id = row_get_rec_trx_id(rec, index, offsets); //获取记录上的TRX_ID这里需要解释下,我们一个查询可能满足的记录数有多个。那我们每读取一条记录的时候就要根据这条记录上的TRX_ID判断这条记录是否可见
return(view->changes_visible(trx_id, index->table->name)); //判断记录可见性
---------------------
作者:仲培艺
来源:CSDN
原文:https://blog.csdn.net/joy0921/article/details/80128857
版权声明:本文为博主原创文章,转载请附上博文链接!
对于不可见的记录都是通过row_vers_build_for_consistent_read函数查询UNDO构建老版本记录,直到记录可见。
这里需要说明一点 不同的事务隔离级别,可见性的实现也不一样:
READ-COMMITTED
事务内的每个查询语句都会重新创建Read View,这样就会产生不可重复读现象发生
REPEATABLE-READ
事务内开始时创建Read View , 在事务结束这段时间内 每一次查询都不会重新重建Read View , 从而实现了可重复读。
trx_sys-> trx_list
https://blog.csdn.net/longxibendi/article/details/42012629
Read view创建之后,读数据时比较记录最后更新的trx_id和view的high/low water mark和读写事务数组即可判断可见性。
https://cloud.tencent.com/developer/ask/210171
https://blog.jcole.us/innodb/
https://github.com/jeremycole/innodb_ruby/wiki
[root@instance-fjii60o3 ~]# gem install innodb_ruby
-bash: gem: command not found
https://rubygems.org/
[root@instance-fjii60o3 develop]# wget https://rubygems.org/rubygems/rubygems-3.0.4.tgz
-rw-r--r-- 1 root root 883664 Jun 14 11:35 rubygems-3.0.4.tgz
Linux установка камень https://www.csdn.net/gather_2b/MtjaUgysNDYzNS1ibG9n.html
[root@instance-fjii60o3 rubygems-3.0.4]# bin/gem
/usr/bin/env: ruby: No such file or directory
Linux установить рубин
https://www.cnblogs.com/xuliangxing/p/7132656.html?utm_source=itdadao&utm_medium=referral
[root@instance-fjii60o3 rubygems-3.0.4]# yum list install | grep ruby
Error: No matching Packages to list
[root@instance-fjii60o3 rubygems-3.0.4]# yum list installed | grep ruby
ruby.x86_64 2.0.0.648-35.el7_6 @updates
ruby-irb.noarch 2.0.0.648-35.el7_6 @updates
ruby-libs.x86_64 2.0.0.648-35.el7_6 @updates
rubygem-bigdecimal.x86_64 1.2.0-35.el7_6 @updates
rubygem-io-console.x86_64 0.4.2-35.el7_6 @updates
Linux установить мерзавец
[root@instance-fjii60o3 ~]# yum install git
[root@instance-fjii60o3 ~]# git clone https://github.com/jeremycole/innodb_ruby.git
[root@instance-fjii60o3 rubygems-3.0.4]# gem install --user-install innodb_ruby
WARNING: You don't have /root/.gem/ruby/bin in your PATH,
gem executables will not run.
Установка и использование обучения Ruby, RubyGems (гем) Package Manager
https://blog.csdn.net/luyaran/article/details/85698936
[root@instance-fjii60o3 rubygems-3.0.4]# yum list installed | grep ruby
Existing lock /var/run/yum.pid: another copy is running as pid 11250.
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: yum
Memory : 90 M RSS (408 MB VSZ)
Started: Sat Aug 3 14:39:05 2019 - 16:44 ago
State : Sleeping, pid: 11250
Система активной идентификатор транзакции
MVCC видимость https://blog.csdn.net/taozhi20084525/article/details/19501075
[root@instance-fjii60o3 develop]# yum localinstall mysql-community-server-8.0.13-1.el7.x86_64.rpm
Loaded plugins: langpacks, versionlock
Existing lock /var/run/yum.pid: another copy is running as pid 11250.
Another app is currently holding the yum lock; waiting for it to exit...
The other application is: yum
Memory : 89 M RSS (408 MB VSZ)
Started: Sat Aug 3 14:39:05 2019 - 1:15:13 ago
State : Traced/Stopped, pid: 11250
[root@instance-fjii60o3 develop]# tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar -C mysql8.0
mysql-community-client-8.0.13-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.13-1.el7.x86_64.rpm
mysql-community-libs-8.0.13-1.el7.x86_64.rpm
mysql-community-server-8.0.13-1.el7.x86_64.rpm
tar: Unexpected EOF in archive
tar: rmtlseek not stopped at a record boundary
tar: Error is not recoverable: exiting now
Ruby Tools InnoDB анализ Структура записи
https://cloud.tencent.com/developer/ask/210171
https://github.com/jeremycole/innodb_ruby/wiki
Установить рубин
gem install innodb_ruby
InnoDB инструменты формата разбор
https://rubygems.org/gems/innodb_ruby/versions
https://www.cnblogs.com/zengkefu/p/5678356.html
Linux посмотреть размер файла
[root@instance-fjii60o3 ~]# du -sh MySQL-5.5.62-1.el7.x86_64.rpm-bundle.tar
2.1M MySQL-5.5.62-1.el7.x86_64.rpm-bundle.tar
[root@instance-fjii60o3 ~]# du -sh develop/
1.1G develop/
Через пять минут , чтобы понять , Mysql на уровне строк блокировки - «добраться до нижнего замка Mysql» https://blog.csdn.net/zcl_love_wx/article/details/81983267
MySQl Есть три уровня блокировки: блокирует таблицу уровня, блокировку на уровне страниц, на уровне строк замок
Каждый раз, когда замок находится ряд запирающего механизма данные запирающий уровне строк (на уровне строк). блокировка на уровне строк не заперта MySQL собственную манеру, но и другими механизмами хранения сами реализованы
Использование на уровне строк блокировка основного механизма хранения InnoDB, и MySQL, распределенное хранение двигателя NDB кластер
замок на уровень строк InnoDB является также разделить на два типа: общие замки и эксклюзивные замки , и в запорном механизме процесса реализации , с тем чтобы обеспечить на уровень строк блокировки и уровень таблицы запирающие сосуществуют , Ьшо также используют намерения блокировки (таблица уровень запирания) из концепция, и мы будем иметь общие намерения замков и намерение монопольной блокировки оба.