Как я могу решить, что хранимая процедура «MySP1» может быть запущена только в режиме несвязанной транзакции?

Я пишу 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 заставит текущий сеанс использовать режим несвязанных транзакций.


Я пробовал следующее, все из которых не помогли:

  1. Добавьте «chained=false» в объект Properties, переданный методу getConnection() (источник советов).

    Это не имело никакого эффекта, скорее всего потому, что мне кажется, что net.sourceforge.jtds.jdbc.Driver не поддерживает свойство chained.

  2. Добавьте «chained=false» в строку URL-адреса, переданную методу getConnection() (источник советов).

    Это тоже не повлияло

  3. Вызывается SET CHAINED OFF SQL после setAutoCommit():

      PreparedStatement st = conn.prepareStatement("SET CHAINED OFF");
      st.execute();
    

    Это не имело никакого эффекта.

  4. Выяснили, как работает setAutoCommit()

    Это привело меня к мысли, что может быть ошибка в драйвере. Тем не менее, #1-#3 должны были исправить ошибку, если это так.

  5. Вызывается setAutoCommit(true) вместо setAutoCommit(false).

    это исправило ошибку про unchained mode, но, насколько я понимаю, это означает, что я НЕ могу откатить 100% своего SQL в конце, так как первые операторы SQL к тому времени уже будут автокоммитированы.


person DVK    schedule 09.06.2012    source источник


Ответы (2)


Насколько я понимаю, "Autocommit" jdbc - это то же самое, что и цепной режим Sybase.

Autocommit true означает фиксацию после каждого оператора — это не связано: транзакции не все в одной «цепочке», которую можно зафиксировать и откатить как единое целое.

Так что вы можете застрять. Если вы не можете изменить этот SP, он всегда будет отключать цепной режим. Вы получаете разумное сообщение. Это на самом деле сообщение об ошибке, или просто ваш код jdbc не обрабатывает его (т.е. отображает его или не отображает, но, по крайней мере, рассматривает его как не ошибку?)

person Abe Crabtree    schedule 20.05.2013

На всякий случай, если кто-нибудь заглянет сюда после стольких лет.

Я наткнулся на такой же случай. Вы были очень близки к способу 3. но в этом случае jTDS не запускает тран (но это обязательно в режиме Unchained). Вы можете сделать это вручную, выполнив

begin transaction

сразу после бега

SET CHAINED OFF
person Krivda    schedule 04.06.2020
comment
для альтернативного драйвера jConnect: аналогичная ситуация разрешается установкой SERVER_INITIATED_TRANSACTIONS=false в строку подключения - person Krivda; 05.06.2020