Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Курсор в транзакции  [new]
Алекс Свиридов
Guest
Доброе день!
Прошу не кидать в меня тапочки, я только учусь!
Мне необходимо сделать курсор в транзакции. Почитав MSDN родил такую конструкцию:

BEGIN TRY

    BEGIN TRAN

    declare Cur CURSOR FOR
    select
      [Name]
    from
      Customers
   
    OPEN Cur
    FETCH NEXT FROM Cur INTO @Name
    WHILE @@FETCH_STATUS = 0
    BEGIN
      --Do somethings
      FETCH NEXT FROM Cur INTO @Name
    END
    CLOSE Cur
    DEALLOCATE Cur

    COMMIT TRAN

  END TRY
  BEGIN CATCH
    
    ROLLBACK TRAN

  END CATCH


Насколько это корректно? Может есть еще какие-нибудь способы?
Очень надеюсь на вашу помощь!
28 ноя 14, 12:32    [16918415]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Мне необходимо сделать курсор в транзакции.

перебрать записи и все ?
28 ноя 14, 13:00    [16918642]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Нет! Записи из курсора вставляются в другую таблицу. Я, просто, не стал приводить код вставки, написав DoSomething. В случае если произойдет какая-либо ошибка, все вставленные записи должны откатится!

Можно ли использовать мою конструкцию в реальной жизни?

И может ли произойти такое, что транзакция окажется не зафиксированной или не откаченой? Или конструкция try catch 100 % всегда сработает?
28 ноя 14, 13:16    [16918771]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Можно ли использовать мою конструкцию в реальной жизни?

Использовать то можно, только зачем ?
Для добавление записей одной таблицы в другую таблицу существует более простая и понятная команда
28 ноя 14, 13:21    [16918810]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Можно использовать insert select, но в курсоре происходят сложные вычисления, которые я не стал описывать, поэтому такой вариант не подходит!

В принципе, конструкция работает, единственное чего я боюсь, что бы не осталось не зафиксированных транзакций! Может в конце добавить проверку @@TRANCOUNT > 0 или не стоит так заморачиваться?
28 ноя 14, 13:29    [16918876]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
но в курсоре происходят сложные вычисления,

Очень хорошо, что вы сообщаете о задаче постепенно. Ведь так всем будет интереснее продолжать беседу - всегда что-нибудь новенькое.

Алекс Свиридов
которые я не стал описывать, поэтому такой вариант не подходит!

Вы сами то знаете, что именно вы хотите сделать в транзакции
- выборку данных
- и/или какие-то рассчеты по выборке
- и/или занесение результатов
28 ноя 14, 13:32    [16918918]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Расчеты нет смысла делать, если они никуда не сохраняются!
Расчеты должны сохраниться в таблицу, либо целиком, либо не сохранятся вообще!

Меня смущает еще один момент помимо не зафиксированных транзакций!
При возникновении ошибки нас перекинет в блок catch при этом инструкции закрытия курсора выполнены не будут. Это страшно? И если - да, то как это можно побороть?
28 ноя 14, 13:56    [16919181]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Расчеты нет смысла делать, если они никуда не сохраняются!
Расчеты должны сохраниться в таблицу, либо целиком, либо не сохранятся вообще!

Ну и зачем вы тогда выборку данных и рассчеты поместили в транзакцию ?

Алекс Свиридов
При возникновении ошибки нас перекинет в блок catch при этом инструкции закрытия курсора выполнены не будут. Это страшно?

Кому страшно ? Вам, серверу, клиентам ?
28 ноя 14, 13:58    [16919212]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Алекс Свиридов
При возникновении ошибки нас перекинет в блок catch при этом инструкции закрытия курсора выполнены не будут. Это страшно? И если - да, то как это можно побороть?

Так поместите
CLOSE Cur
DEALLOCATE Cur
после блока CATCH.
28 ноя 14, 14:09    [16919318]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,
Простите, но мой вопрос вполне конкретный:
может ли быть в этой конструкции возникнуть не зафиксированные транзакции
и не будет ли проблем с закрытием курсора!

Если можете компетентно ответить - я буду рад. Если нет, то давайте поговорим о "страхах клиента и сервера" на каком-нибудь другом форуме!
28 ноя 14, 14:10    [16919333]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
может ли быть в этой конструкции возникнуть не зафиксированные транзакции
и не будет ли проблем с закрытием курсора!

Команды создания/открытия курсора не начинают транзакций.
А команды закрытия/уничтожения курсора не завершают транзакций.
Поэтому ваш "конкретный вопрос" не имеет смысла
28 ноя 14, 14:19    [16919414]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Jovanny,

Ок. Попробую!
28 ноя 14, 14:22    [16919444]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

То есть, вся эта конструкция SQL бессмысленна?
Тогда как иначе можно реализовать эту задачу?
28 ноя 14, 14:26    [16919492]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
То есть, вся эта конструкция SQL бессмысленна?

Какая "эта" ?
Алекс Свиридов
Тогда как иначе можно реализовать эту задачу?

Какую задачу ? Вы ее можете сформулировать всю и сразу ?
28 ноя 14, 14:27    [16919505]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Задача:
из таблицы 1 необходимо считать все строки, применив к каждой из них определенный алгоритм расчета и поместить полученный результат в таблицу 2. Если в процессе расчета происходит какая-либо ошибка, то все записи внесенные в таблицу 2 должны быть удалены.
28 ноя 14, 14:42    [16919619]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
из таблицы 1 необходимо считать все строки, применив к каждой из них определенный алгоритм расчета и поместить полученный результат в таблицу 2. Если в процессе расчета происходит какая-либо ошибка, то все записи внесенные в таблицу 2 должны быть удалены.

1. И где тут что-то про курсор ?
2. Именно в момент рассчета ?
28 ноя 14, 14:44    [16919640]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3684
Алекс Свиридов
Glory,

Задача:
из таблицы 1 необходимо считать все строки, применив к каждой из них определенный алгоритм расчета и поместить полученный результат в таблицу 2. Если в процессе расчета происходит какая-либо ошибка, то все записи внесенные в таблицу 2 должны быть удалены.

курсоры отстой, но даже если и так - запихай курсором во временную, а потом уже ей и апдейть в транзакции быстро и сразу.
28 ноя 14, 14:48    [16919661]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Да, либо в процессе расчета или в процессе вставки в таблицу 2.
28 ноя 14, 14:48    [16919666]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Да, либо в процессе расчета или в процессе вставки в таблицу 2.

Так и не понятно - должны ли именно рассчеты происходить в транзакции по вашим требованиям.
Потому что сами рассчеты еще никаких данных нигде не меняют.
28 ноя 14, 14:51    [16919687]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Расчет и добавление данных происходит в курсоре.
28 ноя 14, 14:57    [16919736]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Расчет и добавление данных происходит в курсоре.

Мда.
А вы вообще понимаете, что такое транзакция и для чего ее нужно использовать ?
И что именно в вашей задаче должна обеспечивать транзакция ?
28 ноя 14, 14:59    [16919754]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

BEGIN TRY

    BEGIN TRAN

    declare Cur CURSOR FOR
    select
      Data
    from
      T1
   
    OPEN Cur
    FETCH NEXT FROM Cur INTO @Data
    WHILE @@FETCH_STATUS = 0
    BEGIN
      set @Data = @Data + 1
      insert into T2(Data) values (@Data) 
      FETCH NEXT FROM Cur INTO @Data
    END
    CLOSE Cur
    DEALLOCATE Cur

    COMMIT TRAN

  END TRY
  BEGIN CATCH
    
    ROLLBACK TRAN

  END CATCH
28 ноя 14, 15:00    [16919770]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

Транзакция должна обеспечить отмену добавления записей в таблицу, в случае ошибки!
28 ноя 14, 15:02    [16919789]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алекс Свиридов
Транзакция должна обеспечить отмену добавления записей в таблицу, в случае ошибки!

Ваше определение транзакции неверное.
Транзакция - это механизм, который выполняет множество(!) команд как единый блок. Т.е. все действия всех команд(!) либо выполнятся целиком, либо отменяются целиком
Вы уверены что вам в одной транзакции нужно выполнить все эти дествия
- выбрать записи
- произвести рассчеты
- занести результаты
28 ноя 14, 15:06    [16919819]     Ответить | Цитировать Сообщить модератору
 Re: Курсор в транзакции  [new]
Алекс Свиридов
Guest
Glory,

К сожалению я в этом не уверен! Но у меня других мыслей, пока, на этот счет нет. Может у вас есть более здравая идея?
28 ноя 14, 15:14    [16919920]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить