Re: MS SQL синхронное выполнение процедур
От: Lloyd Россия  
Дата: 27.09.07 11:35
Оценка: 1 (1) +1
Здравствуйте, ssvg, Вы писали:

S>Добрый день


S>Подскажите если кто знает

S>возможно ли в MS SQL 2005 синхронное выполнение процедур
S>(т.е. в один момент времени процедура должна выполнялась лиш для одного пользователя)
S>порядок обработки запросов к данной процедуре не важен

S>Заранее большое спасибо.


воспользуйтесь процедурами sp_getapplock/sp_releaseapplock
MS SQL синхронное выполнение процедур
От: ssvg  
Дата: 26.09.07 19:40
Оценка:
Добрый день

Подскажите если кто знает
возможно ли в MS SQL 2005 синхронное выполнение процедур
(т.е. в один момент времени процедура должна выполнялась лиш для одного пользователя)
порядок обработки запросов к данной процедуре не важен

Заранее большое спасибо.
Re: MS SQL синхронное выполнение процедур
От: Ромашка Украина  
Дата: 26.09.07 21:42
Оценка:
ssvg wrote:
> возможно ли в MS SQL 2005 синхронное выполнение процедур
> (т.е. в один момент времени процедура должна выполнялась лиш для одного
> пользователя)
> порядок обработки запросов к данной процедуре не важен

глупостьтокакая....

Что-то мне подсказывает, что нужно что-то совсем другое.
Посвяти нас в то, нафига оно тебе, и мы постараемся тебе дать совет как
правильно это сделать.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[2]: MS SQL синхронное выполнение процедур
От: ssvg  
Дата: 27.09.07 07:15
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>глупостьтокакая....


Р>Что-то мне подсказывает, что нужно что-то совсем другое.

Р>Посвяти нас в то, нафига оно тебе, и мы постараемся тебе дать совет как
Р>правильно это сделать.

Необходимо чтобы процедура (или функция) раздовала уникальные значения
зависящие от времени + const (упрощенно говоря)
а если 2 пользователя одновременно вызовут эту функцию (процедуру)
то получим одинаковое значение.
Re[3]: MS SQL синхронное выполнение процедур
От: Crimzic Россия  
Дата: 27.09.07 08:04
Оценка:
S>Необходимо чтобы процедура (или функция) раздовала уникальные значения
S>зависящие от времени + const (упрощенно говоря)
S>а если 2 пользователя одновременно вызовут эту функцию (процедуру)
S>то получим одинаковое значение.
Точность DATETIME — 3.33 мс. Что если если процедура будет отрабатывать настолько быстро, что время не успеет измениться между двумя её вызовами?
А обеспечить синхронное выполнение процедур можно через блокировки.
Re[3]: MS SQL синхронное выполнение процедур
От: Дюша Россия http://www.danfoss.com/russia
Дата: 27.09.07 08:45
Оценка:
Здравствуйте, ssvg, Вы писали:

S>Здравствуйте, Ромашка, Вы писали:


S>Необходимо чтобы процедура (или функция) раздовала уникальные значения

S>зависящие от времени + const (упрощенно говоря)
S>а если 2 пользователя одновременно вызовут эту функцию (процедуру)
S>то получим одинаковое значение.

Раздавать Guids не подойдет? newid() тоже, вроде, уникальные значения возвращает
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>

Re[4]: MS SQL синхронное выполнение процедур
От: kuj  
Дата: 27.09.07 09:32
Оценка:
Здравствуйте, Дюша, Вы писали:

S>>Необходимо чтобы процедура (или функция) раздовала уникальные значения

S>>зависящие от времени + const (упрощенно говоря)
S>>а если 2 пользователя одновременно вызовут эту функцию (процедуру)
S>>то получим одинаковое значение.

Д>Раздавать Guids не подойдет? newid() тоже, вроде, уникальные значения возвращает


Точно. А если надо, чтоб каждый следующий GUID был больше предыдущего, то используйте newsequentialid()
... << RSDN@Home 1.2.0 alpha rev. 746>>
Re[5]: MS SQL синхронное выполнение процедур
От: _d_m_  
Дата: 27.09.07 10:00
Оценка:
Здравствуйте, kuj, Вы писали:

kuj>Точно. А если надо, чтоб каждый следующий GUID был больше предыдущего, то используйте newsequentialid()


Функция NEWSEQUENTIALID() может быть использована только для ограничений DEFAULT для столбцов таблицы типа uniqueidentifier

Re[4]: MS SQL синхронное выполнение процедур
От: _d_m_  
Дата: 27.09.07 10:08
Оценка:
Здравствуйте, Crimzic, Вы писали:

C>А обеспечить синхронное выполнение процедур можно через блокировки.


А лучше так:
create table LastNumber(
    Num int primary key
);
GO
insert LastNumber values(0);
GO

declare @NewNum int;
update
    LastNumber
set
    @NewNum = Num = Num + 1
;
select @NewNum;
Re[4]: MS SQL синхронное выполнение процедур
От: ssvg  
Дата: 27.09.07 11:27
Оценка:
Здравствуйте, Crimzic, Вы писали:

S>>Необходимо чтобы процедура (или функция) раздовала уникальные значения

S>>зависящие от времени + const (упрощенно говоря)
S>>а если 2 пользователя одновременно вызовут эту функцию (процедуру)
S>>то получим одинаковое значение.
C>Точность DATETIME — 3.33 мс. Что если если процедура будет отрабатывать настолько быстро, что время не успеет измениться между двумя её вызовами?
естественно реальный алгоритм это предусматривает.
C>А обеспечить синхронное выполнение процедур можно через блокировки.
Я искал более красивый вариант
Re: MS SQL синхронное выполнение процедур
От: Mr.Cat  
Дата: 27.09.07 19:34
Оценка:
Гм... Можно поиграться с SERIALIZABLE транзакциями: хранить последнее значение счетчика в отдельной таблице — и в транзакции увеличивать и селектить его.
Re[2]: MS SQL синхронное выполнение процедур
От: _d_m_  
Дата: 28.09.07 01:02
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Гм... Можно поиграться с SERIALIZABLE транзакциями: хранить последнее значение счетчика в отдельной таблице — и в транзакции увеличивать и селектить его.


В SERIALIZABLE нет никакой необходимости. Если конечно быть внимательным и читать всю ветку, то можно было бы заметить, что способ предложеный мной здесь
Автор: _d_m_
Дата: 27.09.07
, прекрасно работает в read commited и даже без внешней транзакции.
Re[3]: MS SQL синхронное выполнение процедур
От: Ромашка Украина  
Дата: 28.09.07 08:15
Оценка:
_d_m_ пишет:
> В SERIALIZABLE нет никакой необходимости. Если конечно быть внимательным
> и читать всю ветку, то можно было бы заметить, что способ предложеный
> мной здесь <http://rsdn.ru/Forum/Message.aspx?mid=2672734&amp;only=1&gt;
Автор: _d_m_
Дата: 27.09.07
,

> прекрасно работает в read commited и даже без внешней транзакции.

Ессно без внешней транзакции. С внешней транзакцией, даже read
committed, он попросту стопит все остальное, что пытается получить новый
идентификатор. Тормоза возможны жуткие. Так что ребята юзайте
autoincrement, благо он внетранзакционный.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[3]: MS SQL синхронное выполнение процедур
От: Спильный Андрей Украина  
Дата: 28.09.07 09:11
Оценка:
Здравствуйте, ssvg, Вы писали:

S>Здравствуйте, Ромашка, Вы писали:

Р>>глупостьтокакая....
Р>>Что-то мне подсказывает, что нужно что-то совсем другое.

S>Необходимо чтобы процедура (или функция) раздовала уникальные значения

S>зависящие от времени + const (упрощенно говоря)
S>а если 2 пользователя одновременно вызовут эту функцию (процедуру)
S>то получим одинаковое значение.

ну и в копилку глупых решений глупой проблемы — используйте Extended SP с реализацией блокировки на уровне OS(семафоры, мютексы и пр.)
Re[4]: MS SQL синхронное выполнение процедур
От: Lloyd Россия  
Дата: 28.09.07 09:23
Оценка:
Здравствуйте, Спильный Андрей, Вы писали:

СА>ну и в копилку глупых решений глупой проблемы — используйте Extended SP с реализацией блокировки на уровне OS(семафоры, мютексы и пр.)


Extended здесь не нужны. Вполне достаточно штатных sp_getapplock/sp_releaseapplock.
Re[4]: MS SQL синхронное выполнение процедур
От: _d_m_  
Дата: 29.09.07 04:44
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Ессно без внешней транзакции. С внешней транзакцией, даже read

Р>committed, он попросту стопит все остальное, что пытается получить новый
Р>идентификатор. Тормоза возможны жуткие.

Ну это понятно — в этом случае будет установлена updlock.

Р>Так что ребята юзайте autoincrement, благо он внетранзакционный.


Не всегда возможно. Если мне надо обеспечить именно последовательность для нескольких таблиц?
Re[3]: MS SQL синхронное выполнение процедур
От: . Великобритания  
Дата: 29.09.07 22:41
Оценка:
ssvg wrote:

> Необходимо чтобы процедура (или функция) раздовала уникальные значения

> зависящие от времени + const (упрощенно говоря)
> а если 2 пользователя одновременно вызовут эту функцию (процедуру)
> то получим одинаковое значение.
А зачем эти 2 вещи объединять? Сделать 2 поля: время — обычный
timestamp, уникальное значение — суррогатный pk, обычный autoincrement
или sequence. Пара этих полей будет гарантированно уникальной, т.к.
инкрементное поле гарантированно уникальное.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: MS SQL синхронное выполнение процедур
От: Ромашка Украина  
Дата: 01.10.07 14:12
Оценка:
_d_m_ wrote:
> Не всегда возможно. Если мне надо обеспечить именно последовательность
> для нескольких таблиц?

Не сочтите за наезд, а можно пример, когда такое может понадобиться?
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[6]: MS SQL синхронное выполнение процедур
От: _d_m_  
Дата: 01.10.07 22:55
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>_d_m_ wrote:

>> Не всегда возможно. Если мне надо обеспечить именно последовательность
>> для нескольких таблиц?

Р>Не сочтите за наезд, а можно пример, когда такое может понадобиться?


Ну я навкидку не скажу. Еще такая возможность необходима, когда требуется несколько последовательностей для одной таблицы. И с этим я сталкивался. И решал именно так, как показал выше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.