Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как в транзакции перенести данные без потерь?  [new]
ssms
Member

Откуда:
Сообщений: 124
Добрый день.


Есть две таблички:
table1

table2




Они полностью одинаковые.

Имеют поле, data1 c датой и временем.

В таблицу table1 постоянно идет вставка.

А в таблицу 2 надо перенести данные до определенной даты,

затем удалеить перенесенные данные из таблицы table1



Вот такой механизм ведь не гарантирует что в table1 не вставятся новые данные во время переноса:



BEGIN TRANSACTION
INSERT INTO table2 SELECT * FROM table1 WHERE data1<'20181020 00:00';
DELETE  FROM table1 WHERE data1<'20181020 00:00';
commit;



И получится, если они вставились во время переноса, они не перенесутся и удалятся безвозвратно.


Подскажите пожалуйста как реализовать гарантированный перенос данных?
23 окт 18, 13:40    [21712302]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
ssms
Member

Откуда:
Сообщений: 124
data1 втавляться может любая, в том числе меньше чем '20181020 00:00'.
23 окт 18, 13:42    [21712307]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
ssms,

Output не предлагать?
23 окт 18, 13:46    [21712312]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
ssms,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

Доступно, как минимум, с версии 2012
23 окт 18, 13:48    [21712315]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
andy st
Member

Откуда:
Сообщений: 796
declare @t1 table (a int)
declare @t2 table (b int)
insert into @t1 select 1
insert into @t1 select 2
insert into @t1 select 3
select * from @t1
select * from @t2
delete from @t1 output deleted.* into @t2
select * from @t1
select * from @t2
23 окт 18, 13:51    [21712317]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
ssms
Member

Откуда:
Сообщений: 124
Щукина Анна
ssms,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

Доступно, как минимум, с версии 2012


2008-й.


:(
23 окт 18, 17:06    [21712563]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
ssms
Member

Откуда:
Сообщений: 124
А селект FOR UPDATE тут никак првязать нельзя?


... хотя он для другого наверное. Строки-то новые могут появиться.
23 окт 18, 17:07    [21712564]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
ssms
Щукина Анна
ssms,

https://docs.microsoft.com/ru-ru/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-2017

Доступно, как минимум, с версии 2012


2008-й.


:(


Извиняюсь за ввод в заблуждение....

По ссылке же сказано:
ОБЛАСТЬ ПРИМЕНЕНИЯ: SQL Server (начиная с 2008)
;)
23 окт 18, 17:22    [21712584]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49527
ssms
И получится, если они вставились во время переноса, они не перенесутся и удалятся безвозвратно.

Они не удалятся если транзакция имеет правильный уровень изоляции, запрещающий фантомные чтения.
24 окт 18, 13:41    [21713484]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
ssms
Вот такой механизм ведь не гарантирует что в table1 не вставятся новые данные во время переноса:


А возможно просто заблокировать table1 для вставки?
24 окт 18, 18:06    [21714067]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
ssms,

жесткий способ, set xact_abort on, set transaction level serializable, SELECT * FROM table1 with (tablockx)
мягкий способ, insert + output
25 окт 18, 13:33    [21714771]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
WarAnt
set transaction level serializable, SELECT * FROM table1 with (tablockx)
Нужно еще сервер в однопользовательском режиме запустить, иначе tablockx не сработает...
25 окт 18, 13:57    [21714821]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36692
Достаточно
set transaction isolation level serializable


Если подходящего индекса по дате нет, сервер сам заблокирует всю таблицу.

Сообщение было отредактировано: 25 окт 18, 14:09
25 окт 18, 14:08    [21714845]     Ответить | Цитировать Сообщить модератору
 Re: как в транзакции перенести данные без потерь?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4379
ssms

А в таблицу 2 надо перенести данные до определенной даты,

затем удалеить перенесенные данные из таблицы table1


SWITCH PARTITION
25 окт 18, 17:37    [21715157]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить