предисловие
Подошел запыленный мужчина в клетчатой рубашке, держа в руке MacBook Pro, глядя на редкие волосы и его спокойные глаза.
У меня дрогнуло сердце, я пошел, это архитектор, архитектор вышел мне навстречу по технической части, мне вдруг стало не по себе, поверхность очень устойчива, но сердце запаниковало.
Конечно же, он взял мое резюме в руку, быстро просмотрел его, затем взглянул на меня краем глаза и спросил.
Введение в транзакции Mysql
"Интервьюер:"Увидев, что вы хорошо разбираетесь в методах оптимизации Mysql в своем резюме, давайте сначала поговорим о вашем понимании транзакций Mysql.
Я обрадовался, это просто, мы с братом из Пекинского университета (с большой спиной).
"Я:"Что ж, транзакция базы данных относится к логической единице обработки базы данных, состоящей из группы операторов SQL.В этой группе операций SQL либо все они выполняются успешно, либо все они не выполняются.
"Я:"Простым и классическим примером набора sql операций здесь является перевод.Если перевод должен быть выполнен в транзакции А, то нужно вычесть переданный счет, а добавить переданный счет.Обе операции должны быть выполнены в то же время Успех, чтобы обеспечить согласованность данных.
"Интервьюер:"Вы только что упомянули согласованность данных, знаете ли вы характеристики транзакций? Говорите о своем понимании.
Введение в КИСЛОТУ
"Я:"Четыре основные характеристики транзакций в Mysql в основном включают:"атомарность","Последовательный","изоляция","Прочный", Упоминается какACID
.
"Я:"Атомарность относится к атомарной операции транзакции. Модификация данных либо выполняется успешно, либо все не удается. Атомарность транзакции реализуется на основе журнала.Redo/Undo
механизм.
"Я:"Непротиворечивость означает, что состояние до и после выполнения транзакции должно быть непротиворечивым, что можно понимать как согласованность данных. Изоляция подчеркивает, что транзакции изолированы друг от друга и не затрагиваются, что тесно связано с уровнем изоляции, установленным транзакцией.
"Я:"Постоянство означает, что после фиксации транзакции ее состояние будет сохранено в базе данных, то есть транзакция зафиксирована, а новые и обновленные данные будут сохранены в библиотеке.
"Я:"В моем понимании, атомарность, изоляция и долговечность существуют для обеспечения согласованности, а согласованность также является конечной целью.
Я втайне радовался в душе. Закончив зазубривание, я обычно много читал. Во время интервью я говорил: «К счастью, это меня не беспокоило».
КИСЛОТНЫЙ принцип
"Интервьюер:"Только что вы сказали, что атомарность основана на логах.Redo/Undo
механизм, не подскажете?Redo/Undo
механизм?
а? Что я сказал, я случайно закопал большой гром для себя. Не паникуйте, у брата еще товар в голове, он сделал вид, что задумался, и помолчал несколько десятков секунд, а потом продекламировал.
"Я:"Механизм Redo/Undo относительно прост, они записывают все обновления данных в лог.
"Я:"Журнал повторов используется для записи измененного значения блока данных, который можно использовать для восстановления данных, обновленных успешными транзакциями, которые не были записаны в файл данных; Журнал отмен используется для записи значения перед обновлением данных, чтобы гарантировать что сбой обновления данных можно откатить.
"Я:"Если база данных случайно выйдет из строя во время выполнения, вы можете использовать журнал для отката ранее выполненных операций для достижения согласованности транзакций.
"Интервьюер:"Можете ли вы привести сценарий и рассказать о конкретном процессе реализации?
"Я:"Да, если в какой-то момент происходит сбой базы данных, транзакция A и транзакция B выполняются до сбоя, транзакция A была зафиксирована, но транзакция B еще не зафиксирована. Когда база данных перезапускается для аварийного восстановления, изменения зафиксированных транзакций будут записаны в файл данных через журнал повторов, а те, которые не были зафиксированы, будут отброшены через журнал отмены.
Уровень изоляции транзакции
"Интервьюер:"Вы также упоминали об уровне изоляции транзакции, можете ли вы рассказать об этом?
"Я:"Да, уровень изоляции транзакций в Mysql делится на четыре уровня,"READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE".
"Я:"Read uncommitted будет читать незафиксированные данные другой транзакции, что приводит к проблеме грязного чтения.Read commit решает грязное чтение, и происходит неповторяемое чтение, то есть данные, считанные в любой момент транзакции, могут быть разными, и это может быть связано с другими транзакциями после фиксации модификации данных, как правило, для операции обновления.
"Я:"Повторяемое чтение решает предыдущие проблемы неповторяющихся и грязных чтений, но приводит к проблеме фантомных чтений, которые обычно нацелены на операции вставки.
"Я:"Например: первая транзакция запрашивает таблицу User с id=100 и обнаруживает, что строки данных не существует.В это время снова приходит вторая транзакция, добавляет новую строку данных с id=100 и отправляет транзакцию.
"Я:"В это время, когда первая транзакция добавляет строку данных с идентификатором = 100, будет сообщено о конфликте первичного ключа.Выберите первую транзакцию еще раз и обнаружите, что строка данных с идентификатором = 100 уже существует, что является фантомным чтением.
"Интервьюер:"Можешь продемонстрировать, парень? Я не очень хорош, ты можешь научить меня? Мой компьютер здесь, ты показываешь мне взглянуть.
Мужские рты - обманчивые призраки, я тебе верю, ты, плохой старик, очень плохой, ты всегда должен отплатить, когда выходишь и притворяешься Х, ты можешь закончить это только со слезами в тишине.
"Я:"Сначала создайте таблицу пользователей, последняя - тестовая таблица, в тестовой таблице есть три поля и вставьте два тестовых данных.
CREATE TABLE User ( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
INSERT INTO
user
VALUES (1, 'zhangsan', 23); INSERT INTOuser
VALUES (2, 'lisi', 20);
"Я:"В Mysql вы можете сначала запросить его уровень изоляции по умолчанию.Видно, что уровень изоляции по умолчанию MysqlREPEATABLE-READ
.
"Я:"Давайте сначала продемонстрируем незафиксированное чтение, сначала изменим уровень изоляции по умолчанию наREAD UNCOMMITTED
.
"Я:"Он задает уровень изоляции в операторе set global transactionisolation level read uncommitted, где global также можно заменить на session, global означает глобальный, а session означает текущую сессию, то есть текущее окно допустимо.
"Я:"Когда уровень изоляции установлен, он недействителен для ранее открытого сеанса и вступит в силу только после повторного открытия окна для установки уровня изоляции.
"Я:"Затем нужно открыть транзакцию.Есть два способа открыть транзакцию в Mysql.begin/start transaction
и, наконец, отправьте транзакцию для выполнения фиксации или отката транзакции.
"Я:"в исполненииbegin/start transaction
Команды, они не являются отправной точкой транзакции, и первое sql-выражение после их выполнения указывает на реальное начало транзакции.
"Я:"Здесь сразу открываются два новых окна и одновременно открывается транзакция.В первом окне имя строки данных с id=1 обновляется до «неклассовый класс», и выполнение выполняется успешно. "Я:"Затем второе окно выполняет два запроса, а именно запрос до обновления окна и запрос после обновления. "Я:"Состояние незафиксированных транзакций, сгенерированных первой сессией, напрямую повлияет на вторую сессию, то есть грязные чтения.
"Я:"То же самое верно и для фиксации чтения.После запуска транзакции первая транзакция сначала выполняет данные запроса, а затем вторая сессия выполняет операцию обновления, но фиксации еще нет.Это первая сессия, которую нужно снова выбрать, данные не изменились, а затем снова выбирается первый сеанс.После того, как два сеанса выполняют фиксацию, первый сеанс снова выбирает измененные данные. "Я:"Таким образом, на результат запроса первой транзакции будет влиять вторая транзакция, что является проблемой неповторяющихся операций чтения.
"Интервьюер:"Ребят, а можете нарисовать схему процесса, который он выполняет? Я немного запутался в том, о чем вы говорите, и я еще не до конца понял это.
В моем сердце пролетают 10 000 лошадей, и я хочу плакать, но у меня нет слез. Этому интервьюеру действительно трудно служить. Слишком поздно говорить. Он вынул ручку из левого ягодичного кармана, вынул бумагу из правый задний карман и начал рисовать. "Я:"Это диаграмма оси времени чтения и фиксации, чтение оси времени незафиксированного, принцип тот же, данные изменились при втором выборе.
Это интервьюер, который взял мою фотографию и немного посмотрел на нее, слегка кивнул, с задумчивой улыбкой уголком рта, я думаю, вы, бедный старик, больше не будете мне мешать.
"Интервьюер:"Ну, вы продолжаете демонстрировать свое повторяемое чтение.
"Я:"Ну ладно, тогда повторяемое чтение, та же операция, что и раньше.
"Я:"Откройте две сессии какREPEATABLE READ
, откройте транзакцию одновременно, выберите сначала в первой транзакции, а затем обновите строку данных во второй транзакции.Можно обнаружить, что даже если вторая транзакция была зафиксирована, первая транзакция снова выбирает данные и все еще делает не менять, это решает проблему.проблема неповторяющегося чтения.
"Я:"Разница здесь в том, что в Mysql уровень изоляции неповторяемого чтения по умолчанию также решает проблему фантомного чтения.
"Я:"Из приведенной выше демонстрации видно, что в первой транзакции сначала выбирается строка данных с идентификатором = 3. Эта строка данных не существует. Возвращается пустой набор, а затем вставляется строка данных с идентификатором = 3. вторая транзакция.И коммит, выбранный снова в первой транзакции, данные также являются строкой данных без id=3.
"Я:"Окончательная сериализация, этапы стиля такие же, а результат такой же, как результат уровня изоляции повторяемого чтения по умолчанию в Mysql.Процесс выполнения сериализации эквивалентен изменению процесса выполнения транзакции на последовательное выполнение.Моя сторона Больше никаких демо.
"Я:"Эти четыре уровня сверху вниз, эффект изоляции постепенно усиливается, но производительность становится все хуже и хуже.
Механизм блокировки MySQL
"Интервьюер:"Ой? Производительность ухудшается? Почему производительность ухудшается? Ты можешь сказать мне, почему?
О, мой рот, если вы будете меньше говорить, вы умрете, теперь это хорошо, это должно говорить о лежащем в основе принципе реализации, от оригинала, притворяющегося вдумчивым, до действительно вдумчивого.
"Я:"Это должно начаться с блокировки Mysq.Блокировка в Mysql может быть разделена на точки"Общие блокировки/блокировки чтения","Эксклюзивные блокировки/блокировки записи (эксклюзивные блокировки)","гэп замок","Блокировка записи","блокировка стола".
"Я:"Блокировка четырех уровней изоляции определенно потребляет производительность, а чтение незафиксированных не добавляет никаких блокировок, поэтому оно не имеет эффекта изоляции, поэтому его производительность также является лучшей.
"Я:"Для сериализации добавляется большая блокировка При чтении добавляется разделяемая блокировка, в которую нельзя записать При записи домашняя блокировка является монопольной блокировкой, которая блокирует запись и чтение других транзакций Если другие транзакции нельзя использовать для долгое время Запись будет напрямую сообщать о тайм-ауте, поэтому ее производительность также будет наихудшей, и о параллелизме не может быть и речи.
"Я:"Для фиксации чтения и повторяемого чтения реализация обоих из них заключается в решении проблемы с данными, а затем должно быть определенное количество параллельных выдач, поэтому реализация механизма блокировки будет намного более оптимизирована, чем сериализация, и параллелизм будут улучшены, так что производительность также будет сравниваться хорошо.
"Я:"Базовая реализация двух из них реализована в методе MVCC (многоверсионный контроль параллелизма).
"Интервьюер:"Можете ли вы сначала рассказать о концепции этих замков? Я не очень хорошо понимаю, скажи мне, как ты понял.
"Я:"Ну да ладно, разделяемые блокировки предназначены для одного и того же фрагмента данных, и одновременно может выполняться несколько операций чтения, короче говоря, это чтение плюс блокировки, которые не могут быть записаны и могут читаться параллельно, а исключительные блокировки предназначены для операции записи.Если текущая операция записи не завершена, то она заблокирует другие блокировки записи и блокировки чтения, то есть блокировки записи, а другие блокировки чтения и записи заблокированы.
"Я:"Блокировки строк и блокировки таблиц разделены в соответствии со степенью детализации блокировки. Блокировка строки блокирует текущую строку данных. Степень детализации блокировки мала, блокировка медленная, вероятность конфликта блокировок мала, а степень параллелизма высокий.Блокировка строки также MyISAM и InnoDB.Одно из отличий, InnoDB поддерживает блокировки строк и поддерживает транзакции.
"Я:"Табличные блокировки, с другой стороны, имеют большую степень детализации блокировки, быструю блокировку и низкие накладные расходы, но имеют высокую вероятность конфликта блокировок и низкий уровень параллелизма.
"Я:"Существует два типа гэп-замков:Gap Locks
иNext-Key Locks
. Gap Locks заблокирует интервал между двумя индексами. Например, выберите * из User, где id>3 и id
"Я:"Next-Key Locks — это блокировка с закрытым интервалом, образованная Gap Locks+Record Locks.Выберите * от пользователя, где id>=3 и id=
"Интервьюер:"Когда будет добавлена блокировка в Mysql?
"Я:"При добавлении, удалении, изменении и запросе базы данных эксклюзивные блокировки добавляются только для добавлений, удалений и модификаций, но только для запросов и только путем явного добавления блокировки в режиме общего доступа после оператора select или для обновления для добавления общей блокировки. или эксклюзивный замок.
Основной принцип сделки
"Интервьюер:"Вы упомянули MVCC (управление многоверсионным параллелизмом) выше, можете рассказать о принципе?
"Я:"Согласованные представления используются в реализации MVCC для поддержки реализации фиксации чтения и повторяемых операций чтения.
"Я:"Чтобы достичь уровня изоляции повторяемого чтения, необходимо только создать непротиворечивое представление, также известное как моментальный снимок, в начале транзакции.Это представление согласованности используется в последующих запросах, а изменения данных в последующих транзакциях невидимы. к текущей транзакции. , так что достигается повторяемое чтение.
"Я:"Для фиксации чтения новое представление пересчитывается перед выполнением каждого оператора, что также является разницей между повторяемым фиксацией чтения и фиксацией чтения на уровне реализации MVCC.
"Интервьюер:"Итак, вы знаете, как снимки (представления) работают в нижней части MVCC?
"Я:"Каждая транзакция в InnoDB имеет свой собственный идентификатор транзакции, который уникален и увеличивается.
"Я:"Для каждой строки данных в Mysql может быть несколько версий.Когда каждая транзакция обновляет данные, будет сгенерирована новая версия данных, и строке trx_id текущей версии будет присвоен собственный идентификатор данных.
"Интервьюер:"Мальчик, ты можешь нарисовать картинку, чтобы я мог видеть? Я не понимаю.
Что я могу сделать? У меня не было другого выбора, кроме как достать из заднего кармана ручку и бумагу, и я быстро начал рисовать, два листа бумаги, ручка и вода для этого интервью были бы пустой тратой, поэтому мне пришлось отказаться от него. .
"Я:"Как показано на рисунке, если три транзакции обновляют одну и ту же строку данных, будет три соответствующих версии данных.
"Я:"На самом деле версии 1 и версии 2 физически не существуют, а U1 и U2 на рисунке — это фактически журналы отмен.Версии v1 и v2 рассчитываются на основе текущих журналов v3 и отмен.
"Интервьюер:"Итак, для моментального снимка есть ли у вас какие-либо правила, пока они не следуют?
"Я:"Ну, а для транзакционного представления помимо того, что оно всегда видимо для собственных обновлений, есть еще три ситуации: незафиксированная версия невидима; версия была зафиксирована, но она также невидима после создания представления. была зафиксирована, если фиксация была видна до создания представления.
"Интервьюер:"Если две транзакции выполняют операции записи, как можно гарантировать параллелизм?
"Я:"Если транзакция 1 и транзакция 2 выполняют операцию обновления, то когда транзакция 1 сначала обновляет строку данных, она сначала получает блокировку строки и блокирует данные.Когда транзакция 2 хочет выполнить операцию обновления, она также получает блокировку строки строка данных. , но уже занятая транзакцией 1, транзакция 2 может только ждать.
"Я:"Если транзакция 1 не снимает блокировку в течение длительного времени, транзакция 2 будет иметь исключение тайм-аута.
"Интервьюер:"Это состояние после обновления, где же индекс, да?
"Я:"эм, да.
"Интервьюер:"А если индекса нет? Нет возможности быстро найти строку данных?
"Я:"Если индекса нет, будут получены все строки и будут добавлены блокировки строк, а затем Mysql снова отфильтрует подходящие строки и снимет блокировку. Только подходящие строки будут продолжать удерживать блокировку.
"Я:"Это потребление производительности также будет относительно большим.
"Интервьюер:"Ага
В этот момент интервьюер больше часа смотрел на часы, а уже было время обеда. Думаю, он проголодался и не стал бы дальше задавать вопросы. Они вдвоем замерли на 30 секунд, и он, наконец, заговорил. вверх.
"Интервьюер:"Молодой человек, пора обедать, так что сегодняшнее интервью подходит к концу, можете вернуться и дождаться уведомления.
"Я:". . . . . . . . . .