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

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

Введение.
Уменя напиано приложение "Информационно-справочная система", которая успешно, уже несколько лет работает на базе сервера Oracle. Там у меня реализанна, так называемая "бесконечная транзакция" управляет которой конечный пользователь. Т.е. он может в любой момент отменить/подтвердить изменеия, которые он провел в сеансе, сколько бы много этих изменений небыло. Для избежания конфликтов между несколькими пользователями при попытке изменить одну и туже запись применяется следующий алготитм:
1 шаг: Делается попытка заблокировать запись/записи, которых должно каснуться изменение с опцией "nowait" (без ожидания)
2 шаг: анализируется 1 шаг, если заблокировать записи не удалось,пользователю выдается соответствующее сообщени и опрация прерывается
3 шаг: выполняется требуемое действие.

Проблема.
Мне поставили задачу, чтобы приложение могло работать на базе сервера MS SQL Server 2008 R2
Реализовать "бесконечную транзакцию" в многопользовательском режиме мне не удается, с чем я столкнулся
1.Автоматически блокируются записи, которые попадают в выборку SELECT (это меня просто шокировало)
2. При изменени записи, блокируется вся таблица

В документации нашел что в MS SQL Server 2008 R2 существует 6 видов блоктровки в том числе и блоктровка на уровне записи,
но как это сделать нигде не написано (я не нашел)

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

С MS SQL Server 2008 R2 я работаю еще меньше 1 месяца, и наверно, что-то не предусмотрел.

Помогите разобраться, (уровень изоляции транзакции ReadUnCommitted не предлагать).

Заранее благодарю за помошь
11 окт 11, 21:55    [11423577]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
В документации нашел что в MS SQL Server 2008 R2 ...


А раздел Row Versioning не нашли? Стоит почитать и про гранулярность блокировок, их режимы, совместимость, эскалацию и т.п. :)

ЗЫ. Хотя сам по себе подход не фонтан. Пусть пользователь в своем локальном кэше делает что угодно, а потом сохраняет изменения на сервере за "один присест".
11 окт 11, 22:04    [11423600]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

Откуда:
Сообщений: 9
pkarklin, Спасибо за рекомендацию. А локальный кеш не решает вопрос. Он не блокирует записи, которые пользователь собирается изменять. Как результат конфликт инересов нескольких пользователей. А если юлокировать принудительно, то все на круги своя
12 окт 11, 11:20    [11425195]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
Glory
Member

Откуда:
Сообщений: 104751
Если нужно
iampsd
следующий алготитм:
1 шаг: Делается попытка заблокировать запись/записи, которых должно каснуться изменение с опцией "nowait" (без ожидания)


то почему удивляет
iampsd
1.Автоматически блокируются записи, которые попадают в выборку SELECT (это меня просто шокировало)


iampsd
2. При изменени записи, блокируется вся таблица

Вы это как определили ? По запросу в другом коннекте, который хочет прочитать всю таблицу, включая заблокированные записи ?
12 окт 11, 11:32    [11425305]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

Откуда:
Сообщений: 9
1. Удивление блокированием записей было вызванно не в момент когда пытаюсь проделать мзменения записей, а в простых запросах на "чистый" просмотр
2. Да другой запрос, из другой транзакции, который пытается только прочесть записи включая и заблокированные в первой транзакции
12 окт 11, 14:29    [11426877]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
iampsd
А локальный кеш не решает вопрос. Он не блокирует записи, которые пользователь собирается изменять. Как результат конфликт инересов нескольких пользователей. А если юлокировать принудительно, то все на круги своя


Вопрос решается переходом от пессимистических блокировок к:

1. Блокировкам уровня бизнес-логики (sp_getapplock и иже с ней)
2. Оптимистическим блокировкам в купе с резолвером конфликтов.
12 окт 11, 14:36    [11426944]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
iampsd
1. Удивление блокированием записей было вызванно не в момент когда пытаюсь проделать мзменения записей, а в простых запросах на "чистый" просмотр
2. Да другой запрос, из другой транзакции, который пытается только прочесть записи включая и заблокированные в первой транзакции

1. S-блокировки между собой совместимы, так что непонятно, что вы имеете ввиду. Также на низких уровнях изоляции эти блокировки снимаются сразу после завершения SELECT.
2. S-блокировки совершенно конкретно несовместимы с X-блокировками, но из этого абсолютно не следует, что блокируется таблица.

Решений эти проблемы имеют кучу, но вообще-то сам подход с длительными транзакциями мягко говоря чрезвычайно плох. Не считая конфликтов блокировок, которые в принципе решаемы, существуют принципиально нерешаемые проблемы типа разрыва соединения, при котором транзакция откатывается и все блокировки снимаются. Причем клиент об этом может узнать только при попытке внести изменения.
12 окт 11, 14:55    [11427181]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
Glory
Member

Откуда:
Сообщений: 104751
iampsd
1. Удивление блокированием записей было вызванно не в момент когда пытаюсь проделать мзменения записей, а в простых запросах на "чистый" просмотр
2. Да другой запрос, из другой транзакции, который пытается только прочесть записи включая и заблокированные в первой транзакции

1. Тогда зачем вы блокируете записи "не в момент когда пытаюсь проделать мзменения записей", а раньше ?
2. Только это не "блокируется вся таблица".
12 окт 11, 14:56    [11427186]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

Откуда:
Сообщений: 9
[quot Glory][quot iampsd]1. Тогда зачем вы блокируете записи "не в момент когда пытаюсь проделать мзменения записей", а раньше ?
Здесь имеет место некоторое недопонимание друг друга. Эта фраза относилась к запросам только на чтение и никаких блокировок я там не делал, и тем не менее если два разных приложения выполняют запрос на чтение к одной и той-же информации я нарываюсь на блокировку, об изменениях здесь речь вообще не идет.
Я понимаю, что надо поменять уровни блокировки которые установлены по умолчанию, но вся моя проблема в том, что пока я не знаю где и как это можно сделать.
12 окт 11, 16:27    [11428215]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iljy
Member

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

и вы видели для этих запросов на чтение статус WAIT в списке блокировок? Что-то вы странное говорите. Повторяю - S-блокировки прекрасно между собой совместимы.
12 окт 11, 16:33    [11428272]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
Glory
Member

Откуда:
Сообщений: 104751
iampsd
Здесь имеет место некоторое недопонимание друг друга. Эта фраза относилась к запросам только на чтение и никаких блокировок я там не делал, и тем не менее если два разных приложения выполняют запрос на чтение к одной и той-же информации я нарываюсь на блокировку

Вы придумываете
Два читателю не блокируют друг друга, если вы только специально этого не делаете
12 окт 11, 16:34    [11428290]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

Откуда:
Сообщений: 9
[quot iampsd][quot Glory]пропущено...
Да, такой момент существует, но у меня нет выбора, дело в том что, система не содержит предметной области пользователя, а позволяет конечному пользователю (администратору) самому создать архитектуру своей информационной системы, при этом от него требуется только понимание своей предметной области и больше ничего, кроме того система содержит в себе элементы ГИС, причем конечный пользователь сам может создавать/редактировать графическую информацию, так и атрибутивную. На основании правил заданных конечным пользователем я генерю виртуальную схему, с которой пользователь и работает. Т.е. система имеет только служебные таблицы, а схема и информация пользователя содержатся в них в виде записей.
При реальной работе, пользователь проводит ряд многоплановых изменений касающихся и графической и тестовой информации причем в нескольких "Виртуальных таблицах" и для того чтобы он имел возможность отменить свои действия я вынужден запускать бесконечную транзакцию, потому что у меня нет возможности иначе проконтролировать целостность и непротеворичивость изменния информации не с точки зрения БД, а с точки зрения конечного пользователя.
12 окт 11, 16:46    [11428441]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
Glory
Member

Откуда:
Сообщений: 104751
iampsd
Да, такой момент существует,

Какой "такой момент" ? Вы понимаете, что вам отвечают про блокировки ?

iampsd
При реальной работе, пользователь проводит ряд многоплановых изменений касающихся и графической и тестовой информации причем в нескольких "Виртуальных таблицах" и для того чтобы он имел возможность отменить свои действия я вынужден запускать бесконечную транзакцию, потому что у меня нет возможности иначе проконтролировать целостность и непротеворичивость изменния информации не с точки зрения БД, а с точки зрения конечного пользователя.

Так и непонятно, зачем для "проконтролировать целостность и непротеворичивость изменния информации" нужно блокировать данные с момента их выборки, а нельзя это сделать в момент, когда этот пользователь соизволит закончить "ряд многоплановых изменений"
12 окт 11, 16:51    [11428497]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

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

Вызов функции GetStringNameValue (описанной ниже) из двух разных приложений приводит к сообщению о превышении времени ожидания на блокировку

=======================
CREATE FUNCTION [resource].[GetStringNameValue](@name varchar(64))
RETURNS varchar(256)
AS
BEGIN
DECLARE @id int,@id_lang int, @id_term int;

select
@id=strings_name.id_string
from strings_name
where Upper(strings_name.name_string)=Upper(@name);
if(@id is null)
return @name;
select
@id_lang= gs_general.session_property.id_Language,
@id_term= gs_general.session_property.id_terminology
from gs_general.session_property
where gs_general.session_property.id_spid=@@SPID
and gs_general.session_property.id_host=HOST_ID()
and gs_general.session_property.appl_name=APP_NAME()
and gs_general.session_property.is_close is null;

RETURN isnull(resource.GetStringIdValue(@id,@id_lang,@id_term),@name);

END
--------------------------
CREATE FUNCTION [resource].[GetStringIdValue](@id_str int, @id_lang int = 5, @id_term int = null)
RETURNS varchar(256)
--with schemabinding
AS
BEGIN
DECLARE @val varchar(256)=NULL, @term int;

select @term= isnull(resource.STRINGS_NAME.may_edit,0)
from resource.STRINGS_NAME where resource.STRINGS_NAME.id_string=@id_str;
if(@term = 1)
select
@val=STRINGS_VALUE_TERMINOLOGY.STRING_VALUE
from STRINGS_VALUE_TERMINOLOGY
where STRINGS_VALUE_TERMINOLOGY.ID_STRING=@id_str
and STRINGS_VALUE_TERMINOLOGY.ID_LANGUAGE=@id_lang
and STRINGS_VALUE_TERMINOLOGY.ID_TERMINOLOGY=@id_term;
if(@val is null)
select
@val=strings_value_language.string_value
from strings_value_language
where strings_value_language.id_string=@id_str
and strings_value_language.id_language=@id_lang;
if(@val is null)
begin
declare @l int;
select
@l=language_value.id_language
from language_value
where language_value.language_default=1;
select
@val=strings_value_language.string_value
from strings_value_language
where strings_value_language.id_string=@id_str
and strings_value_language.id_language=@l;
end;

RETURN @val;

END
12 окт 11, 16:57    [11428556]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iljy
Member

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

вообще само понятие "непротиворечивость с точки зрения пользователя" - оксюморон. Ну и все равно не понятно, нафига все эти танцы с блокировками. Если уж совсем не хотите решать конфликты, то помечайте данные, взятые на редактирование, идентификатором пользователя например.
12 окт 11, 16:58    [11428560]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
Glory
Member

Откуда:
Сообщений: 104751
iampsd
Вызов функции GetStringNameValue (описанной ниже) из двух разных приложений приводит к сообщению о превышении времени ожидания на блокировку

Может все же про истечение таймаута на время выполнения запроса ? Где он кстати ?
12 окт 11, 16:59    [11428572]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iljy
Member

Откуда:
Сообщений: 8711
iampsd
iljy,

Вызов функции GetStringNameValue (описанной ниже) из двух разных приложений приводит к сообщению о превышении времени ожидания на блокировку

И что говорит sp_lock?
12 окт 11, 17:00    [11428591]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
iampsd
Member

Откуда:
Сообщений: 9
Всем спасибо! Я нашел причину.
13 окт 11, 09:58    [11431468]     Ответить | Цитировать Сообщить модератору
 Re: Управление блокировкам и транзакциями  [new]
SignOff
Member

Откуда: Stockholm
Сообщений: 424
iampsd,

А поделиться ?
13 окт 11, 10:38    [11431731]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить