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






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;
Пришло время узнать, как работают InnoDB и MVCC. Вы имеете в виду
SET x=yилиSET x=x+1?