путь по умолчанию это работает, что пользователь видит 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 для изменения уровня изоляции транзакций каждой сессии.
Смотрите также:
Ого, спасибо за подробный и очень понятный ответ! Теперь, когда вы упомянули об этом, я действительно помню, как узнал о MVCC, и читатели не блокируют писателей, и наоборот * правила ... спасибо за ссылки тоже, я не знаю, почему я не думал о множественной оболочке окна, которые сделали бы очень простым разобраться сами! И, пожалуйста, простите меня за то, что вы неправильно написали «Джонатан»! haha –
Мое удовольствие, рад помочь. И я просто дразнил тебя по поводу проблемы Джонатана. Спасибо, что приняли его в духе. :-) –