Новый триал [сборка 13468].
Привет всем.
На сайт выгружен дистрибутив новой сборки провайдера 3.12.0.13468, в которой, фактически, завершена летняя работа над ошибками.
Изменение в управлении транзакциями.
В предыдущих версиях провайдера объект управления первым уровнем транзакции оставался одним и тем же для всех транзакций, стартуемых в рамках сессии подключения. То есть можно было один раз получить этот объект (через ITransactionObject::GetTransactionObject) и потом с его помощью коммитить (или откатывать) все транзакции сессии. В текущей сборке этот объект становится недействительным после жесткого коммита или отката. Для новой транзакции нужно будет заново получать объект первого уровня.
Приведу пример с использованием нашего .NET провайдера для OLEDB, который как раз использует такие объекты для управления транзакциями.
using System; using System.Data; using xdb=lcpi.data.oledb; class Program { static void Main(string[] args) { const string c_cn_str ="provider=LCPI.IBProvider.3;" +"location=localhost:d:\\database\\employee.fdb;" +"user id=SYSDBA;" +"password=masterkey"; try { using(var cn=new xdb.OleDbConnection(c_cn_str)) { Console.WriteLine("Open connection..."); cn.Open(); Console.WriteLine("Begin transaction..."); using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead)) { var cmd=new xdb.OleDbCommand("COMMIT",cn,tr); Console.WriteLine("Commit transaction through SQL"); cmd.ExecuteNonQuery(); //---- cmd.CommandText="SET TRANSACTION"; Console.WriteLine("Start new transaction through SQL"); cmd.ExecuteNonQuery(); //---- Console.WriteLine("Try to commit transaction through API"); tr.Commit(); //throw! } }//using cn } catch(Exception exc) { Console.WriteLine(""); Console.WriteLine("ERROR: {0}\n{1}",exc.Source,exc.Message); } }//Main }//class Program
Вывод:
Если использовать версии IBProvider-а, выпущенные до версии 3.12, то последний коммит отработает без ошибок.
Исправление уведомлений транзакции о коммитах и откатах.
При работе с провайдером напрямую, то есть через его OLEDB интерфейсы, можно подписаться на уведомления сессии и транзакции первого уровня для получения уведомлений о завершении низкоуровневой транзакции.
В предыдущих версиях, из за ошибки в проектировании, были следующий проблемы:
1. Клиент не получал уведомления, связанных с новыми транзакциями, после отключения сессии от распределенной транзакции.
2. Клиент продолжал получать уведомления, связанные с новыми транзакциями, от объекта транзакции первого уровня, после завершения этой транзакции. Это проблема связана с вышеописанным некорректным поведением провайдера.
В новой версии все это исправлено.
1. Если клиент подписывается на уведомления через сессию, то он будет получать уведомления о commit/rollback всех транзакций первого уровня, запущенных через ITransactionLocal::StartTransaction или через запрос «SET TRANSACTION».
2. Если клиент подписывается на уведомления через объект первого уровня транзакции, то после того как этот первый уровень будет закоммичен или откачен, клиент больше не будет получать уведомления.
Тесты
Сборка была протестирована со всеми имеющимися версиями IB (4.0-10.0.4) и FB (0.9.4-3.0). Стрессовое тестирование было выполнено с использованием FB 2.5.2.26488.
Релиз IBProvide v3.12.
Будет доступен в самое ближайшее время.