Транзакция при записи уникального индекса видит в самом этом индексе не только значения из строк, которые были закоммичены на момент начала транзакции, но и все последующие, ещё не закоммиченные версии.
>Если мы натыкаемся на конфликт в закомиченной и актуальной на момент старта транзакции строке, то сразу ловим violation.
>Если мы натыкаемся на конфликт с уже записанной другой транзакцией, но ещё не закомиченной строкой, то останавливаемся и ждём завершения той транзакции.
--> Если её закоммитили, то наша транзакция падает с violation.
--> Если откатили, то наша транзакция нормально продолжает работу.
Грубо говоря, оно работает так.
Ну и можно deadlock ещё поймать умеючи в теории.
вот допустим у меня те же массивы варчаров, которые должны быть уникальны, на них есть гин индекс (без уникальности),
потом есть он-инсерт триггер, который ходит в этот индекс на предмет поиска дублей,
есть у него шансы не увидеть вставляемый дубль, если его в то же время закоммитила другая транзакция?