Builder && Транзакции && СУБД
От: Wind Россия  
Дата: 12.11.02 19:41
Оценка:
Ситуация: Программа написаная на C++ Builder через BDE работает с базами данных на FoxPro, Access, SQL Server
Проблема: Работа идет через один экземпляр компонента TQuerry на манер:
Querry->SQL->Add("Insert ...");
Querry->ExecSQL();

Причем таким макаром проходит несколько запросов (через несколько вызовов).


Вопрос: Как мне зафиксировать транзакцию в начале серии запросов и снять в конце серии? Можно ли это делать с помощью SQL запросов?

Вопрос2: Еще хуже то, что в один момент времени могут парралельно исполнятся несколько таких серий, как мне выставлять несколько парралельных транзакций?

Вопрос3: Как при обращении к СУБД заблокировать на доступ ВСЮ БД, а не отдельные ее таблицы?
Re: Builder && Транзакции && СУБД
От: vav Россия  
Дата: 13.11.02 04:41
Оценка:
W>Вопрос: Как мне зафиксировать транзакцию в начале серии запросов и снять в конце серии? Можно ли это делать с помощью SQL запросов?

так называемая "транзакция на клиенте" (пишу по памяти — могу ошибиться):
database.begintansaction;
...
database.endtransaction;



W>Вопрос2: Еще хуже то, что в один момент времени могут парралельно исполнятся несколько таких серий, как мне выставлять несколько парралельных транзакций?


Знаешь, что транзакции блокируют ресурсы? Вторая получит доступ когда первая транзакция завершится. Соответственно нужно минимизировать время "открытости" транзакции; для SQL Server лучше использовать "транзакции на сервере" (частный случай — серверные процедуры).
Re[2]: Builder && Транзакции && СУБД
От: Wind Россия  
Дата: 13.11.02 05:56
Оценка:
Здравствуйте vav, Вы писали:

W>>Вопрос: Как мне зафиксировать транзакцию в начале серии запросов и снять в конце серии? Можно ли это делать с помощью SQL запросов?


vav>так называемая "транзакция на клиенте" (пишу по памяти — могу ошибиться):

vav>
vav>database.begintansaction;
vav>...
vav>database.endtransaction;
vav>


Не знаешь, существует ли на стороне ВСЕХ (Access, SQL Server, FoxPro) этих серверов механизм транзакций инициируемый в духе SQL (языка)?

W>>Вопрос2: Еще хуже то, что в один момент времени могут парралельно исполнятся несколько таких серий, как мне выставлять несколько парралельных транзакций?


vav>Знаешь, что транзакции блокируют ресурсы? Вторая получит доступ когда первая транзакция завершится. Соответственно нужно минимизировать время "открытости" транзакции; для SQL Server лучше использовать "транзакции на сервере" (частный случай — серверные процедуры).


Я не специалист, иначе бы не спрашивал, но, насколько я помню, не все транзакции выставляются целиком на таблицу, некоторые могут ставится на отдельные записи. А минимизировать время "открытости" я не могу по условию задачи. В некоторых случаях я буд ждать 30 минут, в некоторых за 10 секунд вся серия запросов заканчивается...
Re[3]: Builder && Транзакции && СУБД
От: vav Россия  
Дата: 13.11.02 06:19
Оценка:
W>Не знаешь, существует ли на стороне ВСЕХ (Access, SQL Server, FoxPro) этих серверов механизм транзакций инициируемый в духе SQL (языка)?
для SQL Server есть:

begin tran
rollback
commit

Для остальных точно не знаю (подозреваю что нет)


W>Я не специалист, иначе бы не спрашивал, но, насколько я помню, не все транзакции выставляются целиком на таблицу, некоторые могут ставится на отдельные записи.


Именно поэтому я и сказал "ресурсы".. это может быть отдельная запись, таблица, несколько таблиц, вся база.
какую блокировку допускает тот или иной сервер (не хочу называть Access и FoxPro серверами!) нужно узнавать в его документации.

SQL Server допускает блокировку на уровне записи начиная с 7й версии.
Если хочется работать с языком SQL, то лучше обратить внимание на следущие СУБД: MSDE, Interbase (Firebird,Yaffil — мог ошибиться в написании), SQL Server

Все равно в каждом случае свой диалект SQL...

W>А минимизировать время "открытости" я не могу по условию задачи. В некоторых случаях я буд ждать 30 минут, в некоторых за 10 секунд вся серия запросов заканчивается...


Пересмотрите логику — открытая транзакция в течении 30 мин это очень "не нормально"
Возможно имеет смысл сначала дождаться всей "порции" данных и затем "заливать" их на сервер

Еще повторюсь (или добавлю) транзакции на клиенте эффективны при однопользовательской работе (каковой часто является работа с accessом и фокспро).
Re[3]: Builder && Транзакции && СУБД
От: Sinclair Россия http://corp.ingrammicro.com/Solutions/Cloud.aspx
Дата: 13.11.02 10:28
Оценка:
Здравствуйте Wind, Вы писали:

W>Не знаешь, существует ли на стороне ВСЕХ (Access, SQL Server, FoxPro) этих серверов механизм транзакций инициируемый в духе SQL (языка)?

Нет, не на всех. Некоторые СУБД вообще не поддерживают концепцию транзакций. Именно для этого и вводится абстракция драйверов — каждый драйвер сделает все, что можно в нижележащей архитектуре.
W>>>Вопрос2: Еще хуже то, что в один момент времени могут парралельно исполнятся несколько таких серий, как мне выставлять несколько парралельных транзакций?
Делать несколько подключений к базе данных.
vav>>Знаешь, что транзакции блокируют ресурсы? Вторая получит доступ когда первая транзакция завершится. Соответственно нужно минимизировать время "открытости" транзакции; для SQL Server лучше использовать "транзакции на сервере" (частный случай — серверные процедуры).

W>Я не специалист, иначе бы не спрашивал, но, насколько я помню, не все транзакции выставляются целиком на таблицу, некоторые могут ставится на отдельные записи. А минимизировать время "открытости" я не могу по условию задачи. В некоторых случаях я буд ждать 30 минут, в некоторых за 10 секунд вся серия запросов заканчивается...

Транзакции вообще не выставляются ни на что. Транзакция привязана к соединению (иногда одна транзакция может разделяться между несколькими соединениями), а уже с ней ассоциируются все объекты блокировок, выделенные соответствующим ресурсам. Как правило, сервер БД сам достаточно грамтно решает вопрос гранулярности. Иногда ему можно подсказать. Но могут возникнуть проблемы с переносимостью.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
http://rsdn.org/File/5743/rsdnaddict.GIF
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.