У меня была такая же проблема, и я понял, что проблема не в коде .Net, а в хранимой процедуре Проверьте сохраненное определение proc для опции COMMIT. Если для этого параметра установлено значение "* NONE", оно будет автоматически фиксироваться независимо от транзакций в вашем коде .Net. Измените его на * RR (повторяемое чтение), и ваши транзакции должны работать правильно.
Подробнее здесь .