Изменение столбца PK, вероятно, является «удалением» старой записи и «вставкой» новой строки. Я думаю, это подразумевает, что что-то осталось в таблице, но помечено как удаленное (до очистки после фиксации от обеих транзакций).
Аналогично для UNIQUE
изменения ключа. Другие транзакции должны иметь возможность видеть удаленную строку, чтобы проверить наличие дублирующего ключа.
Каждая версия каждой строки (старая / новая) имеет идентификатор транзакции. Итак ...
Повторяемое чтение:
Когда транзакция начинается, ей присваивается «идентификатор транзакции». Это монотонно увеличивающийся порядковый номер для определения строк, которые могут быть изменены. Для изоляции транзакции = RR запросы могут «видеть» только те строки, которые имеют этот идентификатор trx (или более старый). Это объясняет, почему ваш последний SELECT
видит, что он делает. И, обратите внимание, этот запрос фактически (насколько я знаю) повторно выполняется.
Ваш другой txn имел более высокий идентификатор trx. Он создал «более новую» копию строки. Итак, по крайней мере, было две копии этого ряда. Режим изоляции и идентификатор trx определяют, какую строку каждая транзакция может «видеть».