Mysql-транзакции происходят одновременно

Могут ли происходить две транзакции одновременно? Допустим, у вас есть транзакции A и B, каждая из которых будет выполнять чтение, чтобы получить максимальное значение некоторого столбца, а затем запись, чтобы вставить новую строку с этим max + 1. Возможно ли, что A выполняет чтение для получения максимума, а затем B выполняет чтение перед записью A, в результате чего обе транзакции записывают одно и то же значение в столбец?

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

Пришло время узнать, как работают InnoDB и MVCC. Вы имеете в виду SET x=y или SET x=x+1?

tadman 27.06.2018 22:23
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
834
1

Ответы 1

Can two transactions occur at the same time?

Да, это вполне возможно, и на самом деле это требуется, чтобы все СУБД поддерживали эту функцию из коробки, чтобы ускорить работу. Подумайте о приложении, к которому одновременно обращаются тысячи пользователей: если все идет по порядку, пользователям, возможно, придется ждать день, чтобы получить ответ.

Let's say you have transactions A and B, each of which will perform a read to get the max value of some column then a write to insert a new row with that max+1. Is it possible that A performs a read to get the max, then B performs a read before A writes, causing both transactions to write the same value to the column?

Если A и B происходят в двух разных сеансах, это вполне возможный случай пользователя.

Doing this with isolation level set to read uncommitted to false seems to prevent duplicates, but I can't wrap my head around why?

Я думаю, ваше требование получить следующий номер приращения с блоком изоляции довольно распространено, и здесь вам нужно указать базе данных, чтобы должна была произойти взаимная эксклюзивная операция read operation for writing, вы можете указать базе данных сделать это, установив изоляцию, или можете be уровень «временной изоляции» должен решить вашу проблему.

Если получение следующего числа - это всего лишь проблема, и у вас нет других ограничений, тогда

My Sql AUTO_INCREMENT подойдет вам лучше всего. Но, похоже, вы задали этот вопрос конкретно, значит, вы ограничились.

Обратитесь к моим аналогичным вопросам и отвечать.

Ваше решение должно быть примерно таким, как показано ниже.

begin;
select last_number from TABLE1 ... FOR UPDATE;

Read the result in App.

update TABLE1 set last_number=last_number+1 where ...;
commit;

Другие вопросы по теме