2014-01-17 3 views
3

У меня есть опыт использования PHP и MySQL, и я знаю околоСделки, но у них довольно мало опыта использования.Время транзакции MySQL

Я разрабатываю веб-приложение, в котором пользователи будут делать/выполнять различные операции CRUD в/в одну БД. (Да, это InnoDB). И мне очень интересно, какая сделка будет вести себя, я дам вам довольно тривиальный пример:

1.) Пользователь 1 начинает транзакцию, чтобы обновить имя John Smith в моей БД в Johnathon Smith.

2.) Пользователь 2 начинает транзакцию читать имя John Smithсразу после транзакции пользователя 1 в начало, но, прежде чем он COMMITTED.

Что будет видеть пользователь 2? John или Johnathon?

Во время транзакции пользователя 1 является ли запись John Smith заблокирована или ее можно прочитать во время транзакции?

Кроме того, как работает синхронизация с этими двумя транзакциями? Выполняется ли транзакция пользователя 2 в некоторой очереди и дождаться завершения транзакции пользователя 1? Как MySQL DB объединяет несколько транзакций, пытающихся получить доступ к одной и той же таблице/записи?

Кроме того, предположим, что операции транзакции пользователя 1 в среднем занимают 500 мс для завершения, а операции транзакции пользователя 2 - в среднем 750 мс для завершения. Сколько времени ответа будет у пользователя 2? 1250 мс?

Любые ссылки на соответствующие статьи или другие вопросы, касающиеся вопросов, очень приветствуются!

ответ

2

путь по умолчанию это работает, что пользователь видит 2 John Smith до Пользователь 1 не совершает и User 2 начинает новых транзакций.

С другой стороны, по умолчанию транзакционная изоляция называется REPEATABLE-READ. То есть, InnoDB предполагает, что Пользователь 2 хочет видеть базу данных, как это было, когда Пользователь 2 начал свою текущую транзакцию. Даже если другие люди обновляют данные и фиксируют их обновления, Пользователь 2 все еще хочет видеть исходные данные, пока он явно не обновит свое «представление» базы данных.

Способ, которым MySQL решает это, заключается в том, чтобы поддерживать обе версии обновленной строки. «Текущая» версия с Johnathon Smith имеет внутренний указатель на предыдущую версию строки. InnoDB проверит эти версии, выяснит, сможет ли пользователь 2 увидеть текущую версию, а если нет, следуйте указателю на предыдущую версию. Это делается автоматически по очереди.

Существует никаких оснований для ожидания транзакции пользователя 2, и это то, что подразумевается под «читателями не блокировать писателей и наоборот». Это преимущество функции управления параллелизмом с несколькими версиями (MVCC), которая имеет аналогичные реализации в довольно многих продуктах RDBMS, таких как Oracle, PostgreSQL и Firebird.

После того, как пользователь 1 выполнил свое изменение, и никаких транзакций по-прежнему нет, которым нужно видеть предыдущие версии строки, InnoDB имеет фоновый поток, который постепенно очищает эти старые версии.

Это важно, например, для отчетов приложений, которые хотят запускать несколько запросов, и хотят, чтобы все промежуточные итоги совпадали. Если в последних запросах в отчете было несколько обновленное представление базы данных, они могли бы получить разные результаты, чем предыдущие запросы.

Вы можете дополнительно изменить уровень изоляции транзакций READ-COMMITTED, поэтому пользователь 2 будет автоматически иметь его «вид» базы данных обновляются постоянно, чтобы увидеть обновленное имя Johnathon Smith (так в оригинале), но только после пользователя 1 фиксации , Если пользователь 1 еще не зарегистрирован, пользователь 2 не может видеть это изменение.

Вы даже можете изменить уровень изоляции транзакций на READ-UNCOMMITTED, так что пользователь 2 может видеть обновления даже до того, как пользователь 1 совершит транзакцию. Но это редко то, что вы хотите сделать - пользователь 1 может откатиться, потому что Johnathon, очевидно, является орфографическим кодом Jonathan.

Вы можете поэкспериментировать, чтобы проверить все это самостоятельно, открыв два окна оболочки, на которых запущены клиенты mysql, и перепрыгивайте между ними и просматривайте, как изменения становятся видимыми с одного сеанса на другой.

Вы должны узнать, как использовать оператор SET TRANSACTION для изменения уровня изоляции транзакций каждой сессии.

Смотрите также:

+0

Ого, спасибо за подробный и очень понятный ответ! Теперь, когда вы упомянули об этом, я действительно помню, как узнал о MVCC, и читатели не блокируют писателей, и наоборот * правила ... спасибо за ссылки тоже, я не знаю, почему я не думал о множественной оболочке окна, которые сделали бы очень простым разобраться сами! И, пожалуйста, простите меня за то, что вы неправильно написали «Джонатан»! haha –

+1

Мое удовольствие, рад помочь. И я просто дразнил тебя по поводу проблемы Джонатана. Спасибо, что приняли его в духе. :-) –

Смежные вопросы