Я пишу Java-приложение, которому нужно выполнить сложный SQL и откатить все это, если что-то из этого выйдет из строя:
- Откройте соединение с Sybase, используя
net.sourceforge.jtds.jdbc.Driver
- Вызов setAutoCommit(false)
- Выполнить SQL1
- Call stored proc 'MySP1'
- Stored proc MySP1' is NOT under my control
- Он имеет
EXEC sp_procxmode 'dbo.MySP1','unchained'
- Сделать SQL2
- Если SQL2 не работает, откатите все (включая SQL1), в противном случае зафиксируйте.
Сделав это, я получаю следующую ошибку от MySP1:
Хранимая процедура MySP1 может выполняться только в режиме несвязанных транзакций. Команда
SET CHAINED OFF
заставит текущий сеанс использовать режим несвязанных транзакций.
Я пробовал следующее, все из которых не помогли:
Добавьте «chained=false» в объект Properties, переданный методу
getConnection()
(источник советов).Это не имело никакого эффекта, скорее всего потому, что мне кажется, что
net.sourceforge.jtds.jdbc.Driver
не поддерживает свойствоchained
.Добавьте «chained=false» в строку URL-адреса, переданную методу
getConnection()
(источник советов).Это тоже не повлияло
Вызывается
SET CHAINED OFF
SQL послеsetAutoCommit()
:PreparedStatement st = conn.prepareStatement("SET CHAINED OFF"); st.execute();
Это не имело никакого эффекта.
Выяснили, как работает
setAutoCommit()
Это привело меня к мысли, что может быть ошибка в драйвере. Тем не менее, #1-#3 должны были исправить ошибку, если это так.
Вызывается
setAutoCommit(true)
вместоsetAutoCommit(false)
.это исправило ошибку про unchained mode, но, насколько я понимаю, это означает, что я НЕ могу откатить 100% своего SQL в конце, так как первые операторы SQL к тому времени уже будут автокоммитированы.