сериализация транзакций
От: qaz77  
Дата: 26.03.18 13:33
Оценка:
Помогите понять, почему не удается получить SQLSTATE 40001 в следующей ситуации.

Я написал такой тест. Есть один поток пишущий в базу (вставляет записи в простую таблицу id, name).
Есть несколько потоков (4) запрашивающих COUNT(id) этой таблицы. У каждого потока свое соединение.
Для соединения включен режим ручного коммита и уровень изоляции SERIALIZABLE.

Насколько я понимаю сериализацию, пишущая транзакция ставит эксклюзивную блокировку на объект (таблицу?).
Пока такая транзакция открыта, читающая транзакция не может поставить shared блокировку.
Тем не менее deadlock не происходит и 40001 не выбрасывает ни читающие транзакции, ни пишущая.

Подмешивание в пишущую транзакцию селекта ситуацию не меняет.
Установка паузы внутри транзакции (чтобы потоки подольше сидели в открытых транзакциях) также ничего не меняет.
Все это наблюдается одинаково на MS SQL 2008 R2 и Postgres 9.4.

Для меня очевидно, что транзакции, в которых как-то намешано чтение и запись, могут выкидывать 40001.
Поэтому для таких транзакций необходимо предусматривать возможность повторного выполнения.
Тест с несколькими потоками и транзакцией "поискать по name и если нет, то добавить" выбрасывает 40001 в изобилии.

Могут ли транзакции, в которых одни селекты, выкидывать 40001?
Нужно ли обеспечивать для читающих транзакций возможность перезапуска?

Буду признателен, если посоветуете книжку или сайт по теме.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.