Гость
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть? / 8 сообщений из 8, страница 1 из 1
18.02.2014, 12:47
    #38564310
Santa89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
При создании отчета сначала выполняется вставка данных в физическую табличку на сервере, а уже потом из этой физической таблицы - чтение.
То есть что то вроде - exec [моя хранимая процедура которая вставляет в таблицу] и затем select [из этой таблицы].
Естественно в ситуации просмотра отчета несколькими пользователями возникнет блокировка - оба попытаются вставить данные в таблицу, как избежать такого? Где почитать? Я слышал что блокировки нужно делать на уровне приложения а не на серверной стороне. Как быть с ReportingServices?
...
Рейтинг: 0 / 0
18.02.2014, 13:32
    #38564449
Klick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Santa89,

Я тоже хожу брожу вокруг этой проблемы. Решения пока не нашел. Проблема в том, что вставка и чтение происходят в рамках одной длинной транзакции. Причем внутри процедуры куча инсертов, апдейтов и делете.
...
Рейтинг: 0 / 0
18.02.2014, 14:34
    #38564602
Madmech
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Santa89,

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

Что-то вроде такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select *
into #tmpTab
from Tab 

select *
from #tmpTab

drop table #tmpTab


Тогда у вас различные транзакции не будут видеть друг друга.
Если же insert помещен в хранимку, как в Вашем случае, то надо использовать глобальную временную таблицу (##tmpTab). Но я не уверен, что не возникнет та же самая блокировка, лучше проверьте сами.
...
Рейтинг: 0 / 0
18.02.2014, 14:40
    #38564618
Klick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
MadmechЕсли же insert помещен в хранимку, как в Вашем случае, то надо использовать глобальную временную таблицу (##tmpTab). Но я не уверен, что не возникнет та же самая блокировка, лучше проверьте сами.

Пробовали глобальную временную - таже история.
...
Рейтинг: 0 / 0
18.02.2014, 15:28
    #38564711
Madmech
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Klick,

Так, сейчас у нас используется связка Oracle + SSRS, поэтому, возможно, таких ситуаций и не возникало. Но я припоминаю, что на прошлой работе я в аналогичной ситуации выкрутился следующим образом:

1. Сначала создаете хранимку под insert, предполагая в уме, что "времянка" у Вас уже созадана:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
USE [Base]

CREATE PROCEDURE [dbo].[Test]
AS
BEGIN
	
	insert into #tmp
		select *
		from Tab

END


2. Далее создаете основную хранимку, в которую помещаете запуск побочной хранимки из п.1:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USE [Base]

CREATE PROCEDURE [dbo].[Test_Global]
AS
BEGIN

	create table #tmp (/*список полей*/)

	exec [Base].dbo.test

	select *
	from #tmp

	drop table #tmp

END


3. В отчете в DataSet помещаете запуск главной хранимки:
Код: sql
1.
exec [Base].dbo.Test_Global


Я сейчас проверил - эта схема работает, по крайней мере, в Management Studio. Плюс, можно поместить первоначально указанный мной код в одну хранимку и запускать уже ее без нагромождения доп. построений.
...
Рейтинг: 0 / 0
18.02.2014, 15:37
    #38564739
Klick
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Madmech,

Спасибо. В данном варианте решение хорошее.
Но как быть, если мне надо вернуть множество рекордсетов.
У меня одна хранимка делает расчеты, а вторая делает 7 селектов к этим таблицам. И все это в рамках одно длинной транзакции. Потому как RS, по другому не выполнит хранимки в нужной последовательности.
...
Рейтинг: 0 / 0
18.02.2014, 16:58
    #38564856
Madmech
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Klick,

Посмотрите вот это сообщение , да и вообще весь тот тред. Кажется, это то, что Вам нужно. Я еще вспомнил, что в той ситуации, о которой упоминал выше, я именно так и создавал динамически глоб. временную таблицу, предварительно уничтожив уже существующую.
...
Рейтинг: 0 / 0
19.02.2014, 11:09
    #38565648
LSV
LSV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть?
Только не так:
Код: sql
1.
2.
3.
select *
into #tmpTab
from Tab 



А вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select *
into #tmpTab
from Tab
WHERE 1=2

insert into #tmpTab
select *
from Tab 



select * into .... вызывает блокировку схемы, поэтому должен длиться как можно меньше.
...
Рейтинг: 0 / 0
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / SQL Reporting выполняет StoredProcedure. Возникает блокировка. Как быть? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]