Автор Тема: Не явная транзакция в форме объекта  (Прочитано 3516 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
8.2 -4. Проверил трассировки в профайлере:
В режиме совместимости с 8.2 запрос из формы списка документа:
exec sp_executesql N'SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time FROM dbo._Document9 T1 WITH(NOLOCK)


То же самое без режима совместимости:
exec sp_executesql N'SELECT
T1._IDRRef,
T1._Number,
T1._Date_Time
FROM dbo._Document9 T1


Нет указания WITH(NOLOCK)  - значит используется уровень изоляции о умолчанию RCSI.
Droni, к ветке не относится, но в личку вам написать не могу:
Могли бы поучаствовать в http://forum.chistov.pro/index.php?topic=893.150 ?
Что-то у людей энтузиазма не вижу, а вы иногда любите покопаться ) А задачки есть интересные и важные.

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #1 : Май 21, 2015, 04:18:07 pm »
Мне не удалось смоделировать ситуацию, что бы получение свойства объекта через ссылку было выполнено в транзакции.
Для управляемой формы из формы списка документа выполнялось:

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
   СписокПриАктивизацииЯчейкиНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокПриАктивизацииЯчейкиНаСервере(СсылкаНаДокумент)
   //Элементы.Список.ТекущаяСтрока
   //НачатьТранзакцию();
   проведен = СсылкаНаДокумент.Проведен;
   //ЗафиксироватьТранзакцию();
КонецПроцедуры


Для обычных форм из формы списка документа выполнялось:

Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   Проведен = ДанныеСтроки.Ссылка.Проведен;   
   Проведен = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.проведен;
   Пометка = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.ПометкаУдаления;   
КонецПроцедуры

Чтение свойств объекта были без транзакции, наличие транзакции определялось по трассировки профайлера TSQL:BatchCompleted BEGIN TRANSACTION (записей в трассировке не было).

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #2 : Май 21, 2015, 05:29:01 pm »
Мне не удалось смоделировать ситуацию, что бы получение свойства объекта через ссылку было выполнено в транзакции.
Для управляемой формы из формы списка документа выполнялось:

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
   СписокПриАктивизацииЯчейкиНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокПриАктивизацииЯчейкиНаСервере(СсылкаНаДокумент)
   //Элементы.Список.ТекущаяСтрока
   //НачатьТранзакцию();
   проведен = СсылкаНаДокумент.Проведен;
   //ЗафиксироватьТранзакцию();
КонецПроцедуры


Для обычных форм из формы списка документа выполнялось:

Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   Проведен = ДанныеСтроки.Ссылка.Проведен;   
   Проведен = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.проведен;
   Пометка = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.ПометкаУдаления;   
КонецПроцедуры

Чтение свойств объекта были без транзакции, наличие транзакции определялось по трассировки профайлера TSQL:BatchCompleted BEGIN TRANSACTION (записей в трассировке не было).
Проверил.
Вот чтение, чтобы было BEGIN TRANSACTION
   НачатьТранзакцию();
   ПолОб=Справочники.Контрагенты.НайтиПоНаименованию("ИП ""Иванов4""");
   ПолОб3=ПолОб.ПолучитьОбъект();
   ЗафиксироватьТранзакцию();
А вот почему изоляция есть, а BEGIN TRANSACTION нет, без явного указания транзакции в коде:
https://technet.microsoft.com/ru-ru/library/ms188317(v=sql.105).aspx
А вот подробные разборы:
https://technet.microsoft.com/ru-ru/library/jj856598(v=sql.110).aspx
Насколько я понимаю, BEGIN TRANSACTION - формирует 1С, если явно написать про транзакцию в коде, либо поменять какие-либо данные. Ещё чтение НаборовЗаписей надо проверить. При запросах и чтении объектов в объектной технике, платформа отстраняется от исполнения. Она не ставит управляемые блокировки, ни открывает транзакцию. Транзакция формируется автоматом, неявная, непосредственно СУБД. Это объясняет процесс снятия RC до конца транзакции.
« Последнее редактирование: Май 21, 2015, 05:53:38 pm от Platon1C »

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #3 : Май 22, 2015, 01:38:39 am »
Мне не удалось смоделировать ситуацию, что бы получение свойства объекта через ссылку было выполнено в транзакции.
Для управляемой формы из формы списка документа выполнялось:

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
   СписокПриАктивизацииЯчейкиНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокПриАктивизацииЯчейкиНаСервере(СсылкаНаДокумент)
   //Элементы.Список.ТекущаяСтрока
   //НачатьТранзакцию();
   проведен = СсылкаНаДокумент.Проведен;
   //ЗафиксироватьТранзакцию();
КонецПроцедуры


Для обычных форм из формы списка документа выполнялось:

Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   Проведен = ДанныеСтроки.Ссылка.Проведен;   
   Проведен = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.проведен;
   Пометка = ЭлементыФормы.ДокументСписок.ТекущиеДанные.ссылка.ПометкаУдаления;   
КонецПроцедуры

Чтение свойств объекта были без транзакции, наличие транзакции определялось по трассировки профайлера TSQL:BatchCompleted BEGIN TRANSACTION (записей в трассировке не было).
Нашел высказывание Андрея Бурмистрова с его курса (на А. Бурмистрова иногда ссылается Филиппов в книге "Эксперта"):
Если запрос выполняется не в транзакции, то он никаких блокировок не накладывает, запрос будет читать «грязные» данные.
А вот если запрос выполняется в транзакции, тогда будет наложена S блокировка, при этом другие пользователи, тоже смогут читать эти данные, но не смогут их изменить.
А в 8.3 при чтении в транзакции блокировка не будет наложена, так как читается версия объекта к моменту начала транзакции.

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #4 : Май 22, 2015, 11:17:03 am »
Давайте еще раз посмотрим на цитаты:
Цитировать
Или попадетесь на то, что в динамическом списке возможна транзакция, ответите нет - получите минус.
Цитировать
К нашему сожалению, данный вопрос основывается на практических наблюдениях Евгения Филиппова. Он рассказывал, что они долго не могли понять почему в ЖР у них на одном из проектов событие TDEADLOCK показывало контекст формы списка. Выяснилось, что в одном из событий (точно не помню каком) элемента формы (который отображает список) происходит обращение <СтрокаСписка>.Ссылка.Проведен - данный код генерировал неявную транзакцию, которая предназначена для согласованности данных (поправьте меня если не так).
В первой цитате говорится о транзакции, во второй о управляемой взаимоблокировке. Так про что спрашивал экзаменатор, про неявную транзакцию или неявную управляемую блокировку?
Спросил у Бурмистрова https://vk.com/topic-54912661_28338724?post=31

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #5 : Май 22, 2015, 11:20:33 am »
Нашел высказывание Андрея Бурмистрова с его курса (на А. Бурмистрова иногда ссылается Филиппов в книге "Эксперта"):
Если запрос выполняется не в транзакции, то он никаких блокировок не накладывает, запрос будет читать «грязные» данные.
Описанное поведение соответствует уровню изоляции ReadUncommited.

А вот если запрос выполняется в транзакции, тогда будет наложена S блокировка, при этом другие пользователи, тоже смогут читать эти данные, но не смогут их изменить.
Описанное поведение соответствует уровню изоляции ReadCommited.

А в 8.3 при чтении в транзакции блокировка не будет наложена, так как читается версия объекта к моменту начала транзакции.
Описанное поведение соответствует уровню изоляции RCSI.

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #6 : Май 22, 2015, 11:29:40 am »
А вот почему изоляция есть, а BEGIN TRANSACTION нет, без явного указания транзакции в коде:
https://technet.microsoft.com/ru-ru/library/ms188317(v=sql.105).aspx
Как я понял данный режим (Неявные транзакции) позволяет только открывать транзакции не явно, закрывать же их все равно нужно самостоятельно (давать инструкции СУБД COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION или ROLLBACK WORK) (https://technet.microsoft.com/ru-ru/library/ms190230(v=sql.105).aspx).

А вот подробные разборы:
https://technet.microsoft.com/ru-ru/library/jj856598(v=sql.110).aspx
Насколько я понимаю, BEGIN TRANSACTION - формирует 1С,
Да, 1С делает TSQL BEGIN TRANSACTION.

При запросах и чтении объектов в объектной технике, платформа отстраняется от исполнения. Она не ставит управляемые блокировки, ни открывает транзакцию. Транзакция формируется автоматом, неявная, непосредственно СУБД. Это объясняет процесс снятия RC до конца транзакции.
Я бы посмотрел трассировки SQL профайлера (события начала и окончания транзакций), что бы убедиться в этом (что СУБД начинает и завершает транзакцию самостоятельно). У вас нет такой сохраненной трассировки?

Я делал так: в профайлере настроил вывод событий TSQL:BatchCompleted, SP:RPC:Completed, Transactions: все события, кроме TransactionsLog. Сделал фильтр по имени ИБ. Смотрю запросы на получение данных для формы списка, событий из группы Transactions - нет, в событиях RPC:Completed поле TransactionID - пустое. При проведении документа, в профайлере есть события группы Transactions и у событий RPC:Completed поле TransactionID не пустое.



Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #7 : Май 22, 2015, 11:42:18 am »

А вот почему изоляция есть, а BEGIN TRANSACTION нет, без явного указания транзакции в коде:
https://technet.microsoft.com/ru-ru/library/ms188317(v=sql.105).aspx


Как я понял данный режим (Неявные транзакции) позволяет только открывать транзакции не явно, закрывать же их все равно нужно самостоятельно (давать инструкции СУБД COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION или ROLLBACK WORK) (https://technet.microsoft.com/ru-ru/library/ms190230(v=sql.105).aspx).
Это написано про 2008 сервер. Проверить не могу - у меня нету его. А вот 2012 есть и там точно нету обязательных команд фиксаций - не нужны дополнительные инструкции. С течнета:
"Автоматическая фиксация транзакций... После завершения каждая инструкция Transact-SQL фиксируется или откатывается назад. Если инструкция выполняется без ошибок, она фиксируется. В противном случае она откатывается назад. "
https://technet.microsoft.com/ru-ru/library/jj856598(v=sql.110).aspx
« Последнее редактирование: Май 22, 2015, 11:44:38 am от Platon1C »

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #8 : Май 22, 2015, 12:06:04 pm »
Давайте еще раз посмотрим на цитаты:
Цитировать
Или попадетесь на то, что в динамическом списке возможна транзакция, ответите нет - получите минус.
Цитировать
К нашему сожалению, данный вопрос основывается на практических наблюдениях Евгения Филиппова. Он рассказывал, что они долго не могли понять почему в ЖР у них на одном из проектов событие TDEADLOCK показывало контекст формы списка. Выяснилось, что в одном из событий (точно не помню каком) элемента формы (который отображает список) происходит обращение <СтрокаСписка>.Ссылка.Проведен - данный код генерировал неявную транзакцию, которая предназначена для согласованности данных (поправьте меня если не так).
В первой цитате говорится о транзакции, во второй о управляемой взаимоблокировке. Так про что спрашивал экзаменатор, про неявную транзакцию или неявную управляемую блокировку?
Спросил у Бурмистрова https://vk.com/topic-54912661_28338724?post=31
Я думаю (и надеюсь), про неявную транзакцию. Т.к. если он спрашивал про неявную управляемую блокировку - хотел завалить 100%. Эта ситуация рассогласована с распространенными смежными ситуациями, такими как ПолучитьОбъект() (нет управляемой блокировки, а ситуация - зеркало, без сомнений). В данной ситуации вывод про неявную управляемую блокировку может установить далеко не каждый действующий эксперт. Вопрос относится к категории "убийца" ) Такой же: "Какой уровень изоляции в автоматическом режиме в СУБД- версионниках?" - Ваш ответ будет Read Committed. Потому что на http://www.v8.1c.ru/overview/datalockcontrol.htm?printversion=1 много лет висит эта таблица. И преподаватели 1С ведут свои курсы основываясь на этой таблице. И все к этому привыкли. Но реально - ответ Serializable . Это можно проверить самому. И это взял и, наконец, написал Филиппов в "настольной книге... ". Только он там не указал, что это новая вводная, а просто указал в табличке блокировок (стр. 40). Даже в списке опечаток он задел эту тему (http://timurshamiladze.ru/wp-content/uploads/2014/03/Correction1.pdf).
« Последнее редактирование: Май 22, 2015, 04:30:35 pm от Platon1C »

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #9 : Май 22, 2015, 01:32:07 pm »
Вопрос относится к категории "убийца" ) Такой же: "Какой уровень изоляции в автоматическом режиме в СУБД-блокировочниках?" - Ваш ответ будет Read Committed. Потому что на http://www.v8.1c.ru/overview/datalockcontrol.htm?printversion=1 много лет висит эта лживая таблица.
Мой ответ был бы Repeatable Read или Serializable.
Как раз из приведенной табличке по ссылке для СУБД блокировочников будет "Repeatable Read или Serializable", а версионников "Read Committed", вы что то путаете или я не внимателен. Напишите конкретно, в каком столбце какой строки по вашему ошибка.
« Последнее редактирование: Май 22, 2015, 01:33:39 pm от Droni »

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #10 : Май 22, 2015, 01:38:35 pm »
Вопрос относится к категории "убийца" ) Такой же: "Какой уровень изоляции в автоматическом режиме в СУБД-блокировочниках?" - Ваш ответ будет Read Committed. Потому что на http://www.v8.1c.ru/overview/datalockcontrol.htm?printversion=1 много лет висит эта лживая таблица.
Мой ответ был бы Repeatable Read или Serializable.
Как раз из приведенной табличке по ссылке для СУБД блокировочников будет "Repeatable Read или Serializable", а версионников "Read Committed", вы что то путаете или я не внимателен. Напишите конкретно, в каком столбце какой строки по вашему ошибка.
Версионников, прошу прощения.
1С говорит Read Committed, Филиппов говорит Serializable (http://timurshamiladze.ru/wp-content/uploads/2014/03/Correction1.pdf). Эксперименты говорят Serializable.
« Последнее редактирование: Май 22, 2015, 01:40:40 pm от Platon1C »

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #11 : Май 22, 2015, 01:41:55 pm »
Понял о чем вы, но проверить к сожалению не могу.
« Последнее редактирование: Май 22, 2015, 01:45:35 pm от Droni »

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #13 : Май 22, 2015, 01:46:11 pm »
1С говорит Read Committed
Где 1С это говорит, можно ссылку?
http://www.v8.1c.ru/overview/datalockcontrol.htm?printversion=1
Понял о чем вы, но проверить к сожалению не могу (не умею, нету установленных СУБД).

Platon1C

  • Пользователь
  • **
  • Сообщений: 31
  • ФИО: Андрей
Re: Не явная транзакция в форме объекта
« Ответ #14 : Май 22, 2015, 01:50:15 pm »
1С говорит Read Committed
Где 1С это говорит, можно ссылку?
http://www.v8.1c.ru/overview/datalockcontrol.htm?printversion=1
Понял о чем вы, но проверить к сожалению не могу (не умею, нету установленных СУБД).
Вы увидели противоречие ? Возвращаясь к нашему вопросу о неявных блокировках в вопросе экзаменатора. Ведь это тоже противоречие. Управляемый блок только для чтения НабораЗаписей (А. Морозов - "По сути, НаборЗаписей является исключением из правила. Во всех остальных случаях разработчик должен сам всегда следить и устанавливать управляемую блокировку.")? Верно? А Филиппов говорит, что уже нет. Вы согласны? Я правильно размышляю?
Можете это проверить? У меня аллергия на ТЖ, а вы ловко с ним управляетесь )

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #15 : Май 22, 2015, 03:12:29 pm »
Вы увидели противоречие ? Возвращаясь к нашему вопросу о неявных блокировках в вопросе экзаменатора. Ведь это тоже противоречие. Управляемый блок только для чтения НабораЗаписей (А. Морозов - "По сути, НаборЗаписей является исключением из правила. Во всех остальных случаях разработчик должен сам всегда следить и устанавливать управляемую блокировку.")? Верно? А Филиппов говорит, что уже нет. Вы согласны? Я правильно размышляю?
Можете это проверить? У меня аллергия на ТЖ, а вы ловко с ним управляетесь )

Мне не удалось смоделировать ситуацию, что бы получение свойства объекта через ссылку было выполнено с установкой управляемой блокировки по читаемому объекту.
Для управляемой формы из формы списка документа выполнялось:

&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
   СписокПриАктивизацииЯчейкиНаСервере(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура СписокПриАктивизацииЯчейкиНаСервере(СсылкаНаДокумент)
   проведен = СсылкаНаДокумент.Проведен;
КонецПроцедуры

Для обычных форм из формы списка документа выполнялось:

Процедура ДокументСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   Проведен = ДанныеСтроки.Ссылка.Проведен;   
КонецПроцедуры

Droni

  • Модератор
  • Пользователь
  • *****
  • Сообщений: 97
Re: Не явная транзакция в форме объекта
« Ответ #16 : Июнь 10, 2015, 11:10:12 am »
Видимо они все таки есть ...
http://1c.ru/news/info.jsp?id=20040
Цитировать
3.   отслеживать неявные транзакции в отчетах и формах списков;

blizz1205

  • Пользователь
  • **
  • Сообщений: 23
Re: Не явная транзакция в форме объекта
« Ответ #17 : Ноябрь 26, 2015, 10:36:55 am »
Цитировать
Или попадетесь на то, что в динамическом списке возможна транзакция, ответите нет - получите минус.
Интересно спрашивают ли сейчас этот вопрос на экзамене. Но решил посмотреть это на практике. Транзакции в динамическом списке действительно есть.

В первой цитате говорится о транзакции, во второй о управляемой взаимоблокировке. Так про что спрашивал экзаменатор, про неявную транзакцию или неявную управляемую блокировку?

Порадовал термин "управляемая взаимоблокировка" :D. Хотя он верный с той точки зрения, что им оперирует 1С в тестах на профессионала.
« Последнее редактирование: Ноябрь 26, 2015, 11:50:04 pm от blizz1205 »

Ваша реклама могла бы быть тут...