2015-10-15 4 views
0

Есть ли простой способ отключения автоматической фиксации при использовании ODP.NET? Я хочу начать транзакции с помощью команды SET TRANSACTION, не используя Connection.BeginTransaction ни TransactionScope. Также я хочу, чтобы любая начинающая транзакция DML (если не была запущена), но не фиксировала изменения, пока я не выдаю команду COMMIT. Я знаю, что другие поставщики Oracle (JDBC или Devart) поддерживают это, но я хотел бы добиться такого же поведения с ODP.NET.ODP.NET - отключить автоматическое совершение

Я также обнаружил, что есть частное поле, вероятно контролирующее это в управляемой версии ODP.NET, но оно скрыто в реализации физического соединения, к которому трудно получить доступ через экземпляр OracleConnection. Он также кажется, что в неуправляемой версии этот параметр находится вне сборки Oracle.DataAccess.dll.

+0

Не мой , но: _Чтобы выполнить явную транзакцию, вы сначала приобретаете объект OracleTransaction из объекта OracleConnection, вызывая метод BeginTransaction. Обратите внимание, что это единственный способ получить объект транзакции_. Отсюда: [http://www.oracle.com/au/products/database/o39odpnet-087387.html](http://www.oracle.com/au/products/database/o39odpnet-087387.html) –

+0

Это простое описание того, как управлять транзакциями с использованием методов вызова объекта подключения. Я не хочу этого. Я хочу, чтобы транзакция не выполнялась при выпуске первого DML без явного запуска транзакции с использованием BeginTransaction/new TransactionScope. В основном поведение SQL * Plus по умолчанию. – Husqvik

+1

Есть ли причина, по которой вам не нравится 'Connection.BeginTransaction'? –

ответ

3

Единственный способ отключить autocommit с ODP.NET - использовать BeginTransaction/new TransactionScope.

Вы можете дать понять своим пользователям в пользовательском интерфейсе, что autocommit включен по умолчанию, и они могут быть отключены, нажав кнопку на панели инструментов и т. Д., После чего вы можете позвонить в «Начать транзакцию», используя некоторые параметры, которые вы можете разместить в свойств или параметров.

Это именно то, что мы делаем с нашими инструментами разработчика Oracle в окне запросов.

Еще одна возможная вещь, которую нужно изучить - это анонимный PL/SQL для отправки блока SQL-запросов сразу.

Что касается «SET TRANSACTION», я не уверен, что это будет иметь эффект, если вы уже выполнили «BeginTransaction», но можете документировать, что эта команда не поддерживается, если это так (нам нужно было бы сделайте то же самое в нашем окне запроса, если это так).

Если вы хотите ODP.NET быть повышена с помощью этой функции на некотором будущем, вы можете поставить в запросе более на странице запроса функция ODP.NET:

http://apex.oracle.com/pls/apex/f?p=18357:46

+0

Спасибо. Я добавил недостающие функции (больше, чем просто :-)). Хотя я рассматриваю это решение (я его уже использую) больше как обходное решение, чем правильное, ответ принимается. Я не могу использовать анонимный блок, потому что я не хочу выполнять разные инструкции, чем те, которые написаны в редакторе. – Husqvik

Смежные вопросы