в 1С не нужно SET ALLOW_SNAPSHOT_ISOLATION ON #705273


#0 by vi0
Ищу подтверждения своего понимания SNAPSHOT в 1С 8.3 Исходя из документации MSDN вижу, что чтобы включить уровень изоляции транзакции "Read committed snapshot" достаточно выполнить инструкцию: ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT ON и не требуется выполнять ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON Это также подтверждают тесты, которые я делал в SQL Server, а также тот момент, что 1С 8.3 при создании новой базы выполняет инструкцию ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT On WITH ROLLBACK IMMEDIATE и не выполняет инструкцию ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON Но в некоторых статьях по 1С эти инструкции всегда идут парой. Насколько я понимаю, инструкция ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON имеет другое назначение и оно описано в документации MSDN. ВОПРОС: Может кто нибудь сказать что _для 1С_ требуется SET ALLOW_SNAPSHOT_ISOLATION ON и для чего именно?
#0 by vi0
Ищу подтверждения своего понимания SNAPSHOT в 1С 8.3 Исходя из документации MSDN вижу, что чтобы включить уровень изоляции транзакции "Read committed snapshot" достаточно выполнить инструкцию: ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT ON и не требуется выполнять ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON Это также подтверждают тесты, которые я делал в SQL Server, а также тот момент, что 1С 8.3 при создании новой базы выполняет инструкцию ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT On WITH ROLLBACK IMMEDIATE и не выполняет инструкцию ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON Но в некоторых статьях по 1С эти инструкции всегда идут парой. Насколько я понимаю, инструкция ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON имеет другое назначение и оно описано в документации MSDN. ВОПРОС: Может кто нибудь сказать что _для 1С_ требуется SET ALLOW_SNAPSHOT_ISOLATION ON и для чего именно?
#1 by ДенисЧ
"Папа, а ты с кем сейчас говорил?" (с)
#2 by Torquader
Так вы хотите изоляцию по подтверждённым на момент запуска ? Что происходит потом, когда кто-то другой подтверждает параллельную транзакцию ?
#3 by vi0
Я хочу уровень изоляции транзакции "Read committed snapshot". Т.е. тот, который предлагает 1С 8.3
#4 by vi0
на момент запуска чего?
#5 by Torquader
В общем, SET ALLOW_SNAPSHOT_ISOLATION ON включает сохранение версий строк во временной базе TEMPDB. Данные в транзакции "замораживаются" на момент её начала. Поэтому, если в параллельной транзакции будет попытка сделать COMMIT уже считанных данной транзакцией данных, то произойдёт ошибка транзакции.
#6 by vi0
я говорю о статьях которые предлагают включить "Read committed snapshot" вручную в 8.2
#7 by Torquader
SET READ_COMMITTED_SNAPSHOT ON включает доступ к версиям по умолчанию READ_COMMITED.
#8 by vi0
ну так, а если в контексте моего вопроса?
#9 by Torquader
Для 1С лучше всего обеспечивать режим транзакций REPEATABLE READ, так как это гарантирует правильность выполнения расчётов.
#10 by vi0
это оффтоп)
#11 by Torquader
Там написано, что включение двух этих режимов приводит к блокировке на уровне таблиц. То есть, вполне логично, что инструкция не выполняется при работе с управляемыми блокировками.
#12 by Torquader
Посмотри ещё это:
#13 by vi0
это все хорошо и полезно, но не отвечает на мой вопрос
#14 by Torquader
Почитай ещё вот это:
#15 by vi0
если ты про эту строку "For the READ_COMMITTED_SNAPSHOT and ALLOW_SNAPSHOT_ISOLATION levels, the read operations acquire only the Schema Stability (Sch-S) table level locks. It does not lock any pages or rows." То здесь говорится что выполняется только блокировка схемы, если правильно понял. И как раз это позволяет уменьшить блокировки в базе.
#16 by vi0
это одна из статей про которые я говорил мне интересно для чего авторы используют SET ALLOW_SNAPSHOT_ISOLATION ON
#17 by NcSteel
Вруную включать нельзя - нарушение лицензии.
#18 by hhhh
да, вручную там ничего не меняйте, а то фирма 1с вас вычислит и отправит на Магадан.
#19 by Torquader
Предположительно, данная опция также выключает режим блокировок при чтении.
#20 by vi0
Попробую акцентировать еще раз на своем вопросе: В контексте платформы 1С, не важно вручную для 8.2 или как то иначе для 8.3 требуется ли выполнение SET ALLOW_SNAPSHOT_ISOLATION ON если требуется то зачем?
#21 by Torquader
#22 by vi0
еще на всякий случай добавлю я понимаю для чего нужна инструкция SET ALLOW_SNAPSHOT_ISOLATION ON
#23 by Torquader
Включение версионирования в 1С приводит к тому, что разные сеансы могут видеть разные данные (так как изменения происходили в разное время), и, как результат, делать неправильные вычисления. Если версионирования нет, то кто-то видит данные, а кто-то ожидает (в блокировке) пока они будут видны.
#24 by vi0
ты решил весь инет сюда процитировать?)
#25 by Torquader
Ну, вот видишь, ты уже полностью подошёл к мысли, что всё важное и нужное надо искать самому.
#26 by hhhh
вы просто не на тот форум зашли. На SQL форумах спросите.
#27 by vi0
дело в том, что эта тема касается именно 1с я видел хорошие обсуждения на форуме sql, но это в контексте SQL Server, здесь вопрос именно по платформе 1с как вообще обстоит с этими инструкциями я понимаю
#28 by vi0
еще раз в статьях про ручной перевод конф 8.2 на версионник пишут, что нужно выполнить: ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT ON ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON я вижу, что достаточно выполнить ALTER DATABASE ИмяБазы SET READ_COMMITTED_SNAPSHOT ON и именно это делает платформа 8.3 при создании базы
#29 by Torquader
Проведи эксперимент на тестовой базе и посмотри, что происходит. Результат желательно изложить здесь.
#30 by vi0
я провел его в SQL Server, и написал это в сабже
#31 by vi0
результат такой, что записывающая транзакция не блокирует читающую
#32 by hhhh
что это вообще такое "перевод конф на версионник"? Что за птица такая?
#33 by vi0
если кратко, то это способ реализации многопользовательской работы в БД, где в случае параллельность достигается не блокированием изменяемых данных, а созданием своей версии для каждой читающей транзакции (может быть не совсем для каждой..)
#34 by vi0
"в случае" - это лишнее
#35 by Torquader
Так эта команда как раз такой режим и включает.
#36 by hhhh
тогда причем создание базы? База создается в монопольном режиме. Там один пользователь.
#37 by vi0
эту команду нужно выполнить единовременно для базы в целом
#38 by vi0
документация говорит, что ALTER DATABASE ИмяБазы SET ALLOW_SNAPSHOT_ISOLATION ON требуется для уровня изоляции транзакции SNAPSHOT т.е. когда используется инструкция SET TRANSACTION ISOLATION LEVEL SNAPSHOT но я не вижу, чтобы она в 1С использовалась
#39 by hhhh
что за документация?
#41 by hhhh
это майкрософт документация, не 1с.
#42 by floody
если для вас это такой животрепещущий вопрос, то может быть вам спросить об этом например славу гилева..
#43 by Федя Тяпкин
кажется в книжке по эксперту было подробное описание режимов. в каких версиях какой по умолчанию и на что влияют.
#44 by Necessitudo
А что за книжка про эксперта?)
#46 by vde69
зачем тебе это???? на сколько я понял фишка snapshot это то что внутри сеанса который начал транзакцию ты при чтении получаешь данные которые были ДО начала транзакции... то есть запрет грязного чтения даже внутри транзакции.... для 1с такой уровень изоляции в обячной работе нельзя устанавлитать, по тому как в этом случае внутри модуля проведения ты не будешь иметь доступа к новым движениям ...
#47 by vi0
если ты про SET TRANSACTION ISOLATION LEVEL SNAPSHOT то я и говорю, что это не нужно
#48 by Леша1с
"как вообще обстоит с этими инструкциями я понимаю" суть в том, что никто не понимает, как, каким образом, и когда это будет реализовано у 1С.
#49 by Леша1с
"это майкрософт документация, не 1с." у 1С как-бы нет своей СУБД... Десятилетиями использует SQL.
#50 by Леша1с
"зачем тебе это????" правильно, 1С как всегда реализует все своим любимым местом.
#51 by Torquader
На самом деле, там если всё правильно настроить, то никто не получит то, что было после - а при попытке фиксации транзакции, будет её откат. Весь вопрос ещё в том, что бывают ReadOnly транзакции, которые данные не изменяют. В случае snapshot мы выключаем какие-либо блокировки базы транзакциями, только читающими данные, так как они радостно читают свой snapshot и для отчётов, например, это даже лучше, так как весь отчёт снимается на какой-то один момент времени, а не как бог на душу положит.
#52 by Леша1с
"ты при чтении получаешь данные которые были ДО начала транзакции" вы не то что-то написали. Пока транзакция не закончена - данные так и остаются в "исходном" (до транзакции) состоянии. Суть в том, что методом создания снапшота на уровне СУБД (не 1С!!!!! забудьте, это уровень СУБД, SQL и MS) обходится блокировка таблиц, по которым выполняется транзакция/
#53 by Леша1с
+ обходитсмя для чтения, запись все также стоит в очереди, как и было.
#54 by Torquader
Просто, если такой режим в транзакции обновления данных, то можно получить совсем не то, что ожидали - особенно, когда оба сеанса одновременно обновляют данные.
#55 by Леша1с
" по тому как в этом случае внутри модуля проведения ты не будешь иметь доступа к новым движениям ..." можно предположить, что сейчас в 1С мы имеем доступ к данным (к движениям) ВНУТРИ транзакции?
#56 by Леша1с
" по тому как в этом случае внутри модуля проведения ты не будешь иметь доступа к новым движениям ..." сныпшот не работает "на запись". Это сугубо "для чтения". А для чтения - разницы никакой: сеанс прочитал данные, которые через секунду (10 сек, час, день) будут изменены.
#57 by Леша1с
*ответ на "то можно получить совсем не то, что ожидали - особенно, когда оба сеанса одновременно обновляют данные." *снапшот
#58 by Torquader
Так если мы включаем уровень изоляции транзакций, то они могут писать данные в таблице, и не встречать блокировок при этом, блокировка встречается уже при фиксации транзакции.
#59 by hhhh
она использует SQL в урезанной форме. Поэтому глупо брать документацию c сайта майкрософт.
#60 by Леша1с
+ 53 в очереди блокировок. снапшотом обходят сугубо блокировки при чтении, и не более того.
#61 by Torquader
Вы ещё вспомните, как ведётся работа в 1С - сначала мы запросом получаем данные, а потом начинаем что-то куда-то записывать по данным этого запроса.
#62 by Леша1с
о том и речь: - 1С не использует SQL и на 10% - никто не знает, как 1С реализует "снапшот" (возьмет "обрезку", или подключится к "полнрой реализации" снапшота) - гадать про 1С - дело неблагодарное, но глупое.
#63 by Леша1с
" а потом начинаем что-то куда-то записывать по данным этого запроса." вот когда будете писать, то будете писать уже на "общих" основаниях со всеми блокировками и очередями записи.
#64 by Torquader
Так это понятно, только данные-то могут поменяться, если на стадии чтения мы не встретили блокировки.
#65 by Леша1с
+ 63 если имеете в виду, что получили данные чтением с помощью снапшота, приняли решение на их основе писать что-то, а в это время другая параллельная транзакция уже изменила именно эти данные (которые прочли, или которые собрались писать) - то просто будет откат таких ваших действий. Предполагаю, что в MS именно так и реализовано - чтение снапшота и последующая запись "туда же", где уже все модифицировала транзакция, параллеьная снапшоту. Это все-таки не 1С.
#66 by Torquader
Если в одной транзакции - то да - будет откат. Только вот при работе в 1С вместо записи получать откаты - так это вместо работы только жмаканье кнопок на удачу и останется.
#67 by Леша1с
+ 65 а вот, боюсь, в 1С будет реализован именно вариант "без контроля", в результате получим полностью неуправляемыей механизм, который будет писать данные на "основе снапшота", а не реального положенрия с учетом прошедших изменений.
#68 by Леша1с
именно так что с 8.3-4-5 торопиться в промышленных базах ой как не надо еще лет 5.
#69 by Torquader
Особенно хорошо, когда код разбит на несколько транзакций - одна завершилась - другая - откатилась, и теперь нам нужно откатить (точнее отыграть назад) предыдущую - а её уже кто-то "перекрыл" - и всё. В результате работы алгоритма данные в базе пришли в "нестабильное состояние".
#70 by Леша1с
"когда код разбит на несколько транзакций" именно "песочницу" (дискретное выполнение кода) 1С не может реализовать, уже видимо, никогда.
#71 by Леша1с
"В результате работы алгоритма данные в базе пришли в "нестабильное состояние"." прсото сошлются на "неактуальность механизмов снапшота" и по-тихоньку сольют тему в новых релизах, попутно направив внимание 1с-ников на новые перделки-зазеркалки.
#72 by vi0
у меня нет претензий к 1с и к ее реализации snapshot я вижу, что там все корректно
#73 by Torquader
Так это никто реализовать не может, в принципе - так как нужно предусматривать возможность отмены непоследней транзакции без последствий.
#74 by vi0
не забывайте, что snapshot включается только при наличии управляемых блокировок
#75 by Torquader
Он включается командой при начале транзакции, а вот когда 1С эту команду даёт - это уже её (1С) дело.
#76 by vi0
Транзакция начинается или явно программистом или неявно при записи - тут все прозрачно. И до записи/считывания нужно сначала пройти сквозь слой управляемых блокировок.
#77 by Torquader
Это всё понятно, просто 1С, открывая соединение к базе данных, "устанавливает правила игры", то есть делает некоторые установки - что и как она будет читать. Весь вопрос в том - насколько они документированы и насколько SQL-сервер полностью их понимает и обеспечивает правильное функционирование.
#78 by vi0
приведи, пожалуйста, пример, когда > 1С, открывая соединение к базе данных, "устанавливает правила игры", то есть делает некоторые установки
#79 by Torquader
Так лови параметры подключения - там всё должно быть указано, если что-то не менялось, то будет то, что по-умолчанию установлено на сервере.
#80 by Леша1с
любое обращение к SQL - это установка 1С своих правил (отсуствие каких-либо правил - тоже "установка правил игры").
#81 by vi0
так у тебя конкретно к чему претензии?
#82 by vi0
так можно сказать про любого разработчика SQL, что он устанавливает "свои правила игры" взаимодействуя с SQL
#83 by Torquader
Ну а что - не так что-ли ? Все режимы SQL прекрасно задокументированы - выбирай любой, только потом не обижайся, что работает так, как написано.
#84 by Infsams654
А у тебя к чему? 1С сделала под MS SQL, Oracle и т.д? В чем проблемы ? Какая-то реализация под эти СУБД все-таки должна быть, даже, если тебя не устраивает. Забей..
#85 by vi0
ну так прочти сабж для начала
#86 by Torquader
Ну и не со всеми там всё гладко и успешно.
#87 by vi0
а у кого работает не так?
#88 by Леша1с
" так можно сказать про любого разработчика SQL" можно. Только, в отличие от 1С-разработчиков, они все строго документируют, и мы можем прекрасно посмотреть на той же MSDN, что почем.
#89 by vi0
а чего тебе не хватает в документации 1с как для разработчика?
#90 by Леша1с
мне, как и всем пытающимся разобраться в этой свалке, не хватает внятного описания - что, зачем и почему. Вот они написали, что "сделали снапшот". Зачем? Почему именно так?
#91 by Леша1с
+ что теперь, каких действий СУБД и базы 1С ожидать от их такой реализации?
#92 by vi0
возможно минимального описания от них не помешало бы но они поддерживают несколько субд, и в каждой свои особенности реализации уровней изоляции транкций в 8.2 был просто Read Commited для SQL Server - все можно посмотреть было в документации MS сейчас расширили до Read Commited Snapshot - тоже все написано  в онлайне и книгах
#93 by vi0
а зачем? ответ простой - уменьшить блокировки
#94 by Леша1с
"но они поддерживают несколько субд" я бы сказал, что поддерживают одну (MS), а в остальных "играются" ))
#95 by hhhh
ну, может они поддедживают несколько MS SQL?
#96 by vi0
поддерживают
#97 by mistеr
Насколько я понимаю, READ_COMMITTED_SNAPSHOT без ALLOW_SNAPSHOT_ISOLATION работать не будет. Последняя опция более глобальная. Если 1С ее не устанавливает, вероятно она уже включена.
#98 by Леша1с
" Если 1С ее не устанавливает, вероятно она уже включена." Кем?
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С