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

Откуда: МИНСК
Сообщений: 1083
Добрый день всем.

SQL 2012
SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера влияет ли ?


BEGIN
	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT
	  tg.id_Goods
	FROM 
	  [link-server].[db1].[dbo].Goods tg


будет ли
т.е надо ли писать там (Nolock)

ps про вред грязного чтения я знаю - но имеем что имеем.
1 окт 19, 11:16    [21983582]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2265
Гулин Федор,

запустите на ЛинкедСервере профайлер и посмотрите какие команды он получит
1 окт 19, 12:44    [21983740]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1053
Гулин Федор,

если мне память не изменяет сессии linked серверов по умолчанию создают подключения с уровнем изоляции read uncommitted

select s.[name], 
case ss.[transaction_isolation_level]
when 0 then 'NL'
when 1 then 'READ COMMITTED'
when 2 then 'READ UNCOMMITTED'
when 3 then 'REPEATABLE READ'
when 4 then 'SERIZLIZABLE'
when 5 then 'SNAPSHOT'
end
 from sys.servers s
join sys.dm_exec_sessions ss on ss.[host_name] = s.[host_name]
where s.is_linked = 1
1 окт 19, 13:57    [21983851]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1083
StarikNavy
Гулин Федор,

запустите на ЛинкедСервере профайлер и посмотрите какие команды он получит


так запрос вроде на текущем выполняется - и показывается
1 окт 19, 14:23    [21983888]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
felix_ff
Гулин Федор,

если мне память не изменяет сессии linked серверов по умолчанию создают подключения с уровнем изоляции read uncommitted

select s.[name], 
case ss.[transaction_isolation_level]
when 0 then 'NL'
when 1 then 'READ COMMITTED'
when 2 then 'READ UNCOMMITTED'
when 3 then 'REPEATABLE READ'
when 4 then 'SERIZLIZABLE'
when 5 then 'SNAPSHOT'
end
 from sys.servers s
join sys.dm_exec_sessions ss on ss.[host_name] = s.[host_name]
where s.is_linked = 1


запрос неправильный.
для начала он не отфильтрует сессию на линкеде.
т.е. вообще никак.
сессию на линкеде на нем же и надо смотреть.

потом, делаю вот такое:
begin tran
	SET TRANSACTION ISOLATION LEVEL serializable;

declare @id bigint;

select  @id = id
	FROM [COLL_a].[FleetXS_20190808].dbo.transazioni

мне выдается
OLE DB provider "SQLNCLI11" for linked server "COLL_a" returned message "The partner transaction manager has disabled its support for remote/network transactions.".
Msg 7391, Level 16, State 2, Line 66
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "COLL_a" was unable to begin a distributed transaction.


о, да я не буду его даже запускать,
мне distributed transactions не сдались.
тем не менее,
если теперь транзакцию не открывать,
в данной сессии выставлен serializable,
и он же будет в локальных сессиях.

а на линкеде никакой не read uncommitted.
смотрю, что он там блокирует, пока выполняется запрос, так это S на страницы читаемой таблицы
1 окт 19, 14:41    [21983916]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1053
Гулин Федор,

да согласен это входящие сессии для текущего сервера, но вам ничего не мешает завернуть запрос на удаленный сервер

exec ('select transaction_isolation_level from sys.dm_Exec_sessions where session_id = @@SPID') at [linked_server];
1 окт 19, 14:42    [21983918]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
Гулин Федор
StarikNavy
Гулин Федор,

запустите на ЛинкедСервере профайлер и посмотрите какие команды он получит


так запрос вроде на текущем выполняется - и показывается

то, что показывается на локальном,
не соответствует тому, что на линкеде.
у меня выставился serializable сессии,
все таблицы локального будут читаться в этой сессии на serializable.
а что на линкеде это вы не видете с локального.
но возможно, если запущен MSDTC и откроет вам distributaed transaction,
то будут читаться и удаленные с тем же serializable.
если вы в транзакции сделаете.
пока что в коде не вижу begin tran,
а значит, distributaed transaction не будет открыта.
-------------
т.е. тот код, что сейчас нам представлен,
локальной сессии выставил READ UNCOMMITTED,
и больше ничего.
на линкеде будет читаться с READ COMMITTED.

а с хинтом да, будет вам READ UNCOMMITTED.
у меня на линкеде одно лишь Sch-S на объект,
если читаю с nolock
1 окт 19, 14:50    [21983932]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
felix_ff
Гулин Федор,

да согласен это входящие сессии для текущего сервера, но вам ничего не мешает завернуть запрос на удаленный сервер

exec ('select transaction_isolation_level from sys.dm_Exec_sessions where session_id = @@SPID') at [linked_server];

не, не катит, @@SPID это не от той сессии, где его выборка
1 окт 19, 14:54    [21983936]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
о боже.
если локальной сессии не менять уровень изоляции,
то действительно на линкеде читается с read uncommitted.
но зато если у локальной сессии repeatable read или serializable,
то на линкеде накладываются S-блокировки(страничные в моем случае)

это где-то документировано?
1 окт 19, 15:18    [21983973]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
Yasha123
о боже.
если локальной сессии не менять уровень изоляции,
то действительно на линкеде читается с read uncommitted.
но зато если у локальной сессии repeatable read или serializable,
то на линкеде накладываются S-блокировки(страничные в моем случае)

это где-то документировано?

честно никогда не проверял на стороне линкед сервера, но точно будет ругатся если снапшот пытаться включить, а он не разрешён
1 окт 19, 15:45    [21984028]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
вот картинкой основной сервер с serializable
и линкед, на котором больше никого и нет.
и там мое чтение идет с read committed

К сообщению приложен файл. Размер - 24Kb
1 окт 19, 16:48    [21984114]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
Yasha123,

это с подключенным DTC?
1 окт 19, 17:03    [21984138]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
нет, без.
у меня тут типа нет собственной песочницы,
это прод(prod) и "предпрод"(coll), оба с выключенным DTC.
селектить в разумных пределах мне не жалко, но запускать DTC не буду.
транзакцию не открываю, ибо нет DTC.
просто меняю уровень изоляции локальной сессии и селектю с линкеда
1 окт 19, 17:22    [21984152]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6936
Похоже, что на удалённом сервере выполнение идет с текущими настройками сеанса.
1 окт 19, 17:39    [21984173]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1083
Владислав Колосов
Похоже, что на удалённом сервере выполнение идет с текущими настройками сеанса.


Меня частный случай интересует
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

при такой - будут передаваться настройки
на линк-сервер ?


просто не хочется писать везде with (Nolock)
а блокировки по чтению точно будут если READ Commited уровень будет юзаться для доступа к линк-серверу
1 окт 19, 18:03    [21984213]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
Гулин Федор,

exec sp_addlinkedserver @server = N'Self', @srvproduct = '', @provider = N'SQLNCLI', @datasrc = N'.';
exec sp_addlinkedsrvlogin @rmtsrvname = N'Self', @useself = N'True', @locallogin = null, @rmtuser = null, @rmtpassword = null;
exec sp_serveroption @server = N'Self', @optname = N'RPC out', @optvalue = N'true';
exec sp_serveroption @server = N'Self', @optname = N'remote proc transaction promotion', @optvalue = N'false';
go

declare @q nvarchar(max) = N'select at.dtc_isolation_level, st.* from sys.dm_tran_session_transactions st join sys.dm_tran_active_transactions at on at.transaction_id = st.transaction_id;';

set transaction isolation level read uncommitted;
begin distributed tran;
exec sys.sp_executesql @q;
exec Self.tempdb.sys.sp_executesql @q;
commit;

set transaction isolation level read committed;
begin distributed tran;
exec sys.sp_executesql @q;
exec Self.tempdb.sys.sp_executesql @q;
commit;
go

exec sp_dropserver 'Self', 'droplogins';
go
1 окт 19, 18:04    [21984216]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
Гулин Федор
Владислав Колосов
Похоже, что на удалённом сервере выполнение идет с текущими настройками сеанса.


Меня частный случай интересует
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

при такой - будут передаваться настройки
на линк-сервер ?


просто не хочется писать везде with (Nolock)
а блокировки по чтению точно будут если READ Commited уровень будет юзаться для доступа к линк-серверу

да, будет и на линкеде read uncommitted, и без транзакции тоже.
вообще получается что да, настройка сессии на локальном распространяется и на линкед тоже.
это у меня serializable передался в виде S на все страницы...
1 окт 19, 19:10    [21984296]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1083
invm,Yasha123
СПС за ответы
@invm
запустил пример
но выводы сделать не могу
кроме того что резалтсеты одинаковые при разных уровнях
кроме dtc_isolation_level

set transaction isolation level read uncommitted;
set transaction isolation level read committed;

да и вот этой инструкцией я не пользовался никогда.
begin distributed tran

читал конечно в теории что это такое

пару слов если не сложно
2 окт 19, 10:22    [21984578]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6680
Гулин Федор,

автор
пару слов если не сложно

третий участник контролирующий транзакцию. 4 слова :)
2 окт 19, 10:23    [21984581]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6936
Гулин Федор,

распределенные транзакции гарантирую целостность фиксации результата транзакции у всех участников транзакции. Реализуются механизмом распределённых транзакций операционной системы, а не SQL сервером.
2 окт 19, 12:41    [21984751]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1083
Владислав Колосов,
я наверно не точно сформулировал
меня интересует интерпретация (объяснение на пальцах)
результов запроса от invm
от него или от либо любого другого.
ибо я вижу результаты запроса -
2 одинаковых резалтсета
но не сильно понимаю какой вывод я должен был сделать.

ps да у меня в запросе одни Select с линк-сервера и таблиц ( I/U/D нет )
т.е все просто.
2 окт 19, 15:20    [21985025]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
Гулин Федор
меня интересует интерпретация (объяснение на пальцах)
результов запроса от invm
от него или от либо любого другого.

уже выше написано.
что на локальном, то и на линкеде.
в смысле уровня изоляции.
и уж конечно там не "2 одинаковых результата",
там 2 разных, для двух разных уровней.
но что там одинаково, так это TIL локальной сессии и удаленной
2 окт 19, 15:37    [21985052]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1083
Yasha123,
set transaction isolation level read uncommitted;

dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
256 82 469587787 0x0800000052000000 1 1 1 0 0 1


dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
256 82 469587787 0x0800000052000000 1 1 1 0 0 1
256 84 469587787 0x0100000054000000 1 1 0 1 0 1


для 2-го

set transaction isolation level read committed;

dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
4096 82 469587864 0x0900000052000000 1 1 1 0 0 1

dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
4096 82 469587864 0x0900000052000000 1 1 1 0 0 1
4096 84 469587864 0x0200000054000000 1 1 0 1 0 1



объясните что отсюда следует -
мне результаты увы ничего не говорят - вообще - я НЕ понимаю как их интерпертировать
dtc_isolation_level - разный это я понимаю Ид isolation_level
2 окт 19, 15:52    [21985078]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
Гулин Федор
2 одинаковых резалтсета
Одинаковыми они быть не могут.

Более корректный пример:
exec sp_addlinkedserver @server = N'Self', @srvproduct = '', @provider = N'SQLNCLI', @datasrc = @@servername;
exec sp_addlinkedsrvlogin @rmtsrvname = N'Self', @useself = N'True', @locallogin = null, @rmtuser = null, @rmtpassword = null;
exec sp_serveroption @server = N'Self', @optname = N'RPC out', @optvalue = N'true';
exec sp_serveroption @server = N'Self', @optname = N'remote proc transaction promotion', @optvalue = N'false';
go

declare @q nvarchar(max) = N'select @@spid as session_id,
 case transaction_isolation_level 
  when 0 then ''Unspecified'' 
  when 1 then ''ReadUncommitted'' 
  when 2 then ''ReadCommitted'' 
  when 3 then ''RepeatableRead'' 
  when 4 then ''Serializable'' 
  when 5 then ''Snapshot'' end as transaction_isolation_level 
from
 sys.dm_exec_sessions 
where
 session_id = @@SPID';

-- in transaction
set transaction isolation level read uncommitted;
begin distributed tran;

exec sys.sp_executesql @q;
exec Self.tempdb.sys.sp_executesql @q;

set transaction isolation level read committed;

exec sys.sp_executesql @q;
exec Self.tempdb.sys.sp_executesql @q;

commit;

-- without transaction
set transaction isolation level read uncommitted;
exec sys.sp_executesql @q;
exec Self.tempdb.sys.sp_executesql @q;
set transaction isolation level read committed;
go

exec sp_dropserver 'Self', 'droplogins';
go

Думаю, проблем с интерпретацией не возникнет.
2 окт 19, 15:54    [21985082]     Ответить | Цитировать Сообщить модератору
 Re: SET TRANSACTION ISOLATION LEVEL на таблицы линк.сервера  [new]
Yasha123
Member

Откуда:
Сообщений: 1602
Гулин Федор
Yasha123,
set transaction isolation level read uncommitted;

dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
256 82 469587787 0x0800000052000000 1 1 1 0 0 1


dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
256 82 469587787 0x0800000052000000 1 1 1 0 0 1
256 84 469587787 0x0100000054000000 1 1 0 1 0 1


для 2-го

set transaction isolation level read committed;



dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
4096 82 469587864 0x0900000052000000 1 1 1 0 0 1

dtc_isolation_level session_id transaction_id transaction_descriptor enlist_count is_user_transaction is_local is_enlisted is_bound open_transaction_count
-1 70 469568556 0x0100000046000000 1 1 1 0 0 1
4096 82 469587864 0x0900000052000000 1 1 1 0 0 1
4096 84 469587864 0x0200000054000000 1 1 0 1 0 1



объясните что отсюда следует -
мне результаты увы ничего не говорят - вообще - я НЕ понимаю как их интерпертировать
dtc_isolation_level - разный это я понимаю Ид isolation_level

тут 2 набора данных.
сперва invm вам показывает биты(dtc_isolation_level) для read uncommitted на локальном.
потом на локальном и удаленном. они совпали

теперь то же самое для read committed.
снова совпали на локальном и удаленном.

ну просто сказанное мною словами вам предложено лично увидеть,
ничего нового тут нет
2 окт 19, 16:15    [21985105]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить