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

Дано:
Таблица TableData ([ID] INT NOT NULL), которая заполнена значениями (1, 2, 3, 4, 5, 6, 7, 8, 9);
Таблица TableResult ([ID] INT NOT NULL), где [ID] - Primary Key, таблица пустая;

Транзакция 1:
BEGIN TRANSACTION
INSERT TableResult 
SELECT * FROM TableData WHERE ID >=3 AND ID <= 7
WAITFOR DELAY '00:01';
COMMIT

Транзакция 2:
BEGIN TRANSACTION
INSERT TableResult 
SELECT * FROM TableData
WAITFOR DELAY '00:01';
COMMIT

Транзакция 1 и Транзакция 2 по приоритету выполнения равноправные; В моем случае они выполняются паралельно!

Задача:
Если Транзакция 1 начала выполняться раньше чем Транзакция 2 то нужно что бы SELECT * FROM TableData в Транзакция 2 возвращал данные (1, 2, 8, 9);
Если Транзакция 2 начала выполняться раньше чем Транзакция 1 то нужно что бы SELECT * FROM TableData WHERE ID >=3 AND ID <= 7 в Транзакция 1 не возвращал данныx;

Как такое сделать?

P.S. Смотрел уровни изоляции транзакций и блокировки но нужного мне результата не добился.
Спасибо!
29 май 13, 20:18    [14366710]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
При чем здесь вообще изоляция, если TableData ни в одной транзакции не меняется?
29 май 13, 20:25    [14366730]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Курсовой?

BOL->READPAST Table Hint.

ЗЫ. Но могут быть нюансы.
29 май 13, 20:27    [14366738]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
Гавриленко Сергей Алексеевич
При чем здесь вообще изоляция, если TableData ни в одной транзакции не меняется?

Не меняется, но нужно залочить записи для чтения другой транзакции, если они были прочитаны в первой транзакции.
29 май 13, 20:28    [14366739]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Постановка задачи намекает, что в обеих транзакциях должно быть что-то типа
DELETE TableData
output
  deleted.id
INTO
  TableResult(
    id
  ) 
FROM  TableData 
WHERE ID >=3 AND ID <= 7 -- В каждой транзакции свое условие


Сообщение было отредактировано: 29 май 13, 20:31
29 май 13, 20:29    [14366741]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
pkarklin
Курсовой?

BOL->READPAST Table Hint.

ЗЫ. Но могут быть нюансы.


Какие ньюансы?
29 май 13, 20:29    [14366743]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
_true_
Гавриленко Сергей Алексеевич
При чем здесь вообще изоляция, если TableData ни в одной транзакции не меняется?

Не меняется, но нужно залочить записи для чтения другой транзакции, если они были прочитаны в первой транзакции.
Тогда реально лочить и readpast.
29 май 13, 20:30    [14366745]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
Гавриленко Сергей Алексеевич
Постановка задачи намекает, что в обеих транзакциях должно быть что-то типа
DELETE TableData
output
  deleted.id
INTO
  TableResult(
    id
  ) 
FROM  TableData 
WHERE ID >=3 AND ID <= 7 -- В каждой транзакции свое условие


Без COMMIT-a это не имеет смысла, или я не прав?
29 май 13, 20:34    [14366756]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
_true_
Какие ньюансы?


Вы уже прочитали соответствующий раздел документации?
29 май 13, 20:34    [14366758]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
Гавриленко Сергей Алексеевич
_true_
пропущено...

Не меняется, но нужно залочить записи для чтения другой транзакции, если они были прочитаны в первой транзакции.
Тогда реально лочить и readpast.


Можна пример?
Заранее благодарен.
29 май 13, 20:35    [14366761]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
pkarklin
_true_
Какие ньюансы?


Вы уже прочитали соответствующий раздел документации?


Обязательно прочту, но могут быть и не документированные ньюансы.
29 май 13, 20:37    [14366766]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Может, вы решаемую задачу огласите?
29 май 13, 20:38    [14366771]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
Гавриленко Сергей Алексеевич
Может, вы решаемую задачу огласите?

Это и есть задача в самом упрощенном варианте, или какие то неясности присутствуют в постановке задачи?
29 май 13, 20:43    [14366786]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
_true_
Гавриленко Сергей Алексеевич
Может, вы решаемую задачу огласите?

Это и есть задача в самом упрощенном варианте, или какие то неясности присутствуют в постановке задачи?
Это выбранный вами метод решения какой-то задачи.
29 май 13, 20:44    [14366789]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
Гавриленко Сергей Алексеевич
_true_
пропущено...

Это и есть задача в самом упрощенном варианте, или какие то неясности присутствуют в постановке задачи?
Это выбранный вами метод решения какой-то задачи.


Мне нужно чтобы эти 2 транзакции работали паралельно и отрабатывали без ошибок, но так как действия совершаемые транзакциями в конечном итоге одинаковы то обрабатывать одинаковые данные паралельно они не должны но и разделить данные так чтобы они не пересекались в транзакциях нельзя.
29 май 13, 21:00    [14366838]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
_true_
Можна пример?
Можно.
+ Подготовка
use tempdb;
go

create table dbo.TestTable (i int not null primary key with (allow_page_locks = off));
insert into dbo.TestTable
values
 (1), (2), (3), (4);
Сеанс1:
use tempdb;
go

set transaction isolation level read committed;
begin tran;
select * from dbo.TestTable with (xlock, readpast) where i in (1, 2, 3);
--rollback;
Сеанс2:
use tempdb;
go

set transaction isolation level read committed;
begin tran;
select * from dbo.TestTable with (xlock, readpast) where i in (1, 2, 4);
--rollback;
Можете позапускать в разной последовательности.
Хотите нюансов? Закоментируйте в одном из скриптов xlock.
29 май 13, 22:47    [14367247]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
invm
Закоментируйте в одном из скриптов xlock.
Забыл дописать: и позапускать в разной последовательности.
29 май 13, 23:25    [14367394]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
invm
invm
Закоментируйте в одном из скриптов xlock.
Забыл дописать: и позапускать в разной последовательности.


Ничего неожиданного для себя не заметил, вполне предсказуемое поведение.
Единственно уровень изоляции транзакции менять не хотелось бы. Как восстановить уровень изоляции транзакции который был до этого?
29 май 13, 23:50    [14367472]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
_true_
Ничего неожиданного для себя не заметил, вполне предсказуемое поведение
И какое же поведение вы наблюдали?
30 май 13, 00:13    [14367544]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
invm
_true_
Ничего неожиданного для себя не заметил, вполне предсказуемое поведение
И какое же поведение вы наблюдали?


1. Если сначало запускать транзакцию без лока то во второй транзакции c локом данные из первой транзакции все равно читаются.
2. Eсли сначала запускать с локом то данные не читаются во второй транзакции которая без лока.
30 май 13, 00:23    [14367566]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
_true_,

Версия сервера?
30 май 13, 00:44    [14367605]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
_true_
Guest
invm
_true_,

Версия сервера?

2008R2
30 май 13, 01:02    [14367625]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
MasterZiv
Member

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

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

Вычитание через Not exists тебе нужно добавить в оба запроса.

После этого уже начнутся проблемы с изоляцией, нужно поднять уровень изоляции до serializable. Если не поможет - тупо блокировать всю целевую таблицу в начале каждой транзакции.
30 май 13, 08:00    [14367803]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
_true_
pkarklin
Курсовой?

BOL->READPAST Table Hint.

ЗВУК. Но могут быть нюансы.


Какие ньюансы?


Нюансы такие, что фигню он спорол.
READPAST уменьшает изоляцию, а тут ее надо повышать.
30 май 13, 08:03    [14367809]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции и доступ к данным для чтения?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
вот ссылка в тему:
http://aboutsqlserver.com/2013/05/08/locking-in-microsoft-sql-server-part-17-implementing-critical-section-mutexes-in-t-sql/
30 май 13, 09:24    [14368109]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить