Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транзакции [D7, Любая]


Страницы:   1 2

parovoZZ ©   (2006-04-16 21:40:00) 

Есть следующее:
  try
   ADOConnection.BeginTrans;
   ADOCmd.Execute ();

  except
   ADOConnection.RollbackTrans;

  end;
   ADOConnection.CommitTrans;


Так вот допустим, что во время выполнения операции произошёл обрыв связи с сервером. Куда тогда уйдёт инструкция Rollback?

И потом: обязательно ли явно объявлять транзакцию на операнд SELECT?


sniknik   (2006-04-17 11:30:00) [21]

упс.
> Сервер, допустим, MySQL
не обратил внимания... тогда про неявную транзакцию для записи не в курсе... в принципе должна быть но х.ч. как оно там в нем на самом деле...


sniknik   (2006-04-17 11:27:00) [22]

> надо вставить пару-тройку записей по мегабайту каждая.
они зависимы друг от друга? т.е. если не вставить последнюю то первая (к примеру) смысла не имеет? если имеет то не имеет смысла транзакция (неявная на обеспечение целосности самой записи и так будет). размер записи тут совсем не причем.

> А что, ADOCommand поддерживает несколько SQL инструкций???
столько сколько поддерживает "Любая" база...


Sergey13   (2006-04-17 11:14:00) [23]

2 [6] parovoZZ ©   (17.04.06 11:02)
>1. Сервер, допустим, MySQL, так и не дождавшись ответа, отвергнет вставку...или как?
Должен отвергнуть. В этом и смысл транзакций.

>2. Если надо реализовать каскадное удаление записей, то лучше делать через хранимую процедуру?
Каскадное удаление лучше делать через каскадное удаление по внешнему ключу. 8-)


parovoZZ   (2006-04-17 11:02:00) [24]

1. Я это всё к тому, что, допустим, надо вставить пару-тройку записей по мегабайту каждая. И при передачи последних 1 кб связь оборвалась. Тогда AdoCommand вызовет исключение, в свою очередь RollbackTrans тоже вызовет исключение. Сервер, допустим, MySQL, так и не дождавшись ответа, отвергнет вставку...или как?

2. Если надо реализовать каскадное удаление записей, то лучше делать через хранимую процедуру?

// А что, ADOCommand поддерживает несколько SQL инструкций??? Сильно тоКА не бейте, учусь же.


Джо   (2006-04-16 23:12:00) [25]

Чтобы не быть голословным, вот простейшая ситуация.
Несколько ADOCmd вызывают ХМ на сервере, в зависимости от результатов предыдущих ХП определяются параметры (и необходимость) вызова следующих и т.п. Все вызовы должны проходить в рамках единой транзакции. Т.е, один из случаев, когда логика определяется на клиенте.

Всё, теперь я готов к получению своей порции тухлых помидоров :)


Джо   (2006-04-16 23:08:00) [26]

> [3] sniknik ©   (16.04.06 22:39)
> BeginTrans как и все остальное на клиенте выкинуть нафиг...
>
> писать в скрипте команды ADOCmd
>
> BEGIN TRANSACTION
> ...
> INSERT ...
> ...
> COMMIT TRANSACTION

Ну, я сделал поправку к конкретному коду, а не пытался "вправить" мировозрение :)
К тому же, я сомневаюсь, чтобы твой твой подход можно было назвать "универсальным". Есть ситуации (даже не говоря о различиях в СУБД), когда совершенно не представляется разумным запихнуть логическую транзакцию в один скрипт ADOCmd.


sniknik   (2006-04-16 22:39:00) [27]

> BeginTrans также вынеси перед try
BeginTrans как и все остальное на клиенте выкинуть нафиг...

писать в скрипте команды ADOCmd

BEGIN TRANSACTION
...
INSERT ...
...
COMMIT TRANSACTION

недостаток - база "Любая" это не поддерживает, только база "конкретная"... вообще надо запретить на форуме обсуждение вопросов относящихся к более чем одному типу баз. имхо. бред это.
достоинство - раз пакет дошол до сервера то выполнится как положено, не дошол так даже не начнется...

p.s. для одиночного инсерта самому транзакцию стартовать... это чтото типа паранойи (болезнь такая), если не лечить то и программа "с приветом" будет. ;)


Джо   (2006-04-16 22:09:00) [28]

BeginTrans также вынеси перед try, потому, что если транзакция не началась (возникло исключение), то и откатывать нечего.


Johnmen   (2006-04-16 21:50:00) [29]

А зачем после роллбека делать коммит? :)


> Куда тогда уйдёт инструкция Rollback?


В песок...


> обязательно ли явно объявлять транзакцию на операнд SELECT?


Не обязательно даже на простой инсерт, например.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо