Помогите понять, почему не удается получить SQLSTATE 40001 в следующей ситуации.
Я написал такой тест. Есть один поток пишущий в базу (вставляет записи в простую таблицу id, name).
Есть несколько потоков (4) запрашивающих COUNT(id) этой таблицы. У каждого потока свое соединение.
Для соединения включен режим ручного коммита и уровень изоляции SERIALIZABLE.
Насколько я понимаю сериализацию, пишущая транзакция ставит эксклюзивную блокировку на объект (таблицу?).
Пока такая транзакция открыта, читающая транзакция не может поставить shared блокировку.
Тем не менее deadlock не происходит и 40001 не выбрасывает ни читающие транзакции, ни пишущая.
Подмешивание в пишущую транзакцию селекта ситуацию не меняет.
Установка паузы внутри транзакции (чтобы потоки подольше сидели в открытых транзакциях) также ничего не меняет.
Все это наблюдается одинаково на MS SQL 2008 R2 и Postgres 9.4.
Для меня очевидно, что транзакции, в которых как-то намешано чтение и запись, могут выкидывать 40001.
Поэтому для таких транзакций необходимо предусматривать возможность повторного выполнения.
Тест с несколькими потоками и транзакцией "поискать по name и если нет, то добавить" выбрасывает 40001 в изобилии.
Могут ли транзакции, в которых одни селекты, выкидывать 40001?
Нужно ли обеспечивать для читающих транзакций возможность перезапуска?
Буду признателен, если посоветуете книжку или сайт по теме.