Нет, только транзакции не решают проблемы параллелизма.Давайте быстро вернемся к определению транзакций mysql :
Транзакции - это атомарные единицы работы, которые можно зафиксировать или откатить.Когда транзакция вносит несколько изменений в базу данных, либо все изменения завершаются успешно, когда транзакция фиксируется, либо все изменения отменяются при откате транзакции.
Подводя итог: транзакцииспособ обеспечения целостности данных. СУБД
используют различные типы блокировка , уровни изоляции и решения на уровне подсистемы хранения для обеспечения параллелизма.Люди часто ошибочно принимают транзакции как средство управления параллелизмом, потому что транзакции влияют на то, как долго удерживаются определенные блокировки.
Сосредоточение на InnoDB: когда вы выполняете оператор update
, mysql помещает эксклюзивная блокировка на обновляемой записи.Только транзакция, имеющая монопольную блокировку, может изменить данную запись, остальные должны ждать, пока транзакция не будет совершена.
Как это помогает вам предотвратить одновременное извлечение одной и той же книги несколькими пользователями?Допустим, у вас есть поле id
, однозначно идентифицирующее книги, и поле checked_out
, указывающее статус книги.
Вы можете использовать следующий атомный update
, чтобы получить книгу:
update books set checked_out=1 where id=xxx and checked_out=0
Критерий checked_out=0
гарантирует, что update
будет успешным, только если книга еще не выписана.Таким образом, если приведенный выше оператор влияет на строку, то текущий пользователь проверяет книгу.Если это не влияет ни на какие строки, тогда кто-то еще уже проверил книгу.Эксклюзивная блокировка гарантирует, что только одна транзакция может обновить запись в любой момент времени, тем самым сериализовав доступ к этой записи.
Если вы хотите использовать отдельную таблицу checkouts
для резервирования книг, то вы можетеиспользуйте уникальный индекс идентификаторов книг, чтобы предотвратить повторное извлечение одной и той же книги.