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

Откуда: Восточнее Урала
Сообщений: 53
Всем доброго вечера!

Есть процедура, которая помечает записи забронированными за сессией, в ней выполняется основной запрос:

update N
    set N.Session_Id = @SessionId 
from Negotiations as N
     cross apply dbo.fGetBillsToReserve(@SessionId, @HolderId, @Count, @BillValue) f
where N.Negotiation_Id = f.Negotiation_Id;


И есть процедура, которая выбирает помеченную запись, по сессии, в ней основной запрос:

select top 1 @NegotiationId=Negotiation_Id, @BillPrice=Bill_Price from vNegotiationsAll where Session_Id=@SessionId


правда, выбирает из представления, а не из таблицы.

Так вот этот запрос может почему-то вернуть пустой набор.
Если написать вот так:

   declare @Co int; SET @Co=50;
    while (@NegotiationId is null  and  @Co>0)
	begin
          select top 1 @NegotiationId=Negotiation_Id, @BillPrice=Bill_Price from vNegotiationsAll
            where Session_Id=@SessionId;
          set @co=@co-1;
          insert into Errors (ERROR_PROCEDURE, ERROR_Var) values ('prSellBillsToGuest', convert(nvarchar(50), @SessionId)+' NegotiationId=null');
      end;


То на 4-5 итерации вернет то, что нужно

Поможите, пожалуйста, из-за чего не сразу выбираются данные
17 ноя 16, 20:10    [19905253]     Ответить | Цитировать Сообщить модератору
 Re: SELECT только с третьего-пятого раза  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5115
- вы проверяли, что в момент запроса
select top 1 ... where Session_Id=@SessionId
в табл Negotiations есть записи у которых Session_Id = @SessionId?
- смотрели на скорость работы вашей cross apply dbo.fGetBillsToReserve?
17 ноя 16, 21:17    [19905482]     Ответить | Цитировать Сообщить модератору
 Re: SELECT только с третьего-пятого раза  [new]
iljy
Member

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

Что делает функция fGetBillsToReserve? Откуда берется @SessionID? Запросы в одной транзакции или в разных? Если в разных и сессий несколько, то они запросто могут отбирать друг у друга записи, т.к. проверки на то, что запись еще не распределена, нет.
17 ноя 16, 21:32    [19905553]     Ответить | Цитировать Сообщить модератору
 Re: SELECT только с третьего-пятого раза  [new]
AlexSYSka
Member

Откуда: Восточнее Урала
Сообщений: 53
gGetBillsToReserve - по сути выбирает случайным образом данные из предстваления, у которых Session_Id = null и их возвпащает :

RETURNS @Bills TABLE (Negotiation_Id int,
FullBillNumber varchar(8)
)
AS
BEGIN
insert into @Bills
select top(@Count) vn.Negotiation_Id, vn.FullBillNumber from 
vNegotiationsAll vn where vn.Holder_Id=@HolderId and vn.Bill_Value=@BillValue
and vn.Session_Id is null
order by dbo.i_now_i()
END


Session_Id - приходит от клиента, заранее сгенерированным на сервере.

Все работает в разных транзакциях и в разных сессиях подключения к серверу - все через web. При чем если я ставлю на две кнопки - записать, считать и нажимаю их вручную - такая ошибка не возникает, но как только я делаю последовательный вызов этих функций - начинаются косяки. Видимо, все таки запись не распределена, как говорил iliy, но как это проверить,я что-то вообще не могу понять, даже на каком уровне и какими функциями?
18 ноя 16, 08:05    [19906185]     Ответить | Цитировать Сообщить модератору
 Re: SELECT только с третьего-пятого раза  [new]
AlexSYSka
Member

Откуда: Восточнее Урала
Сообщений: 53
Переписал процедуру, которая бронирует записи за сессиями - убрал функцию и cross apply:

declare @Neg_Id int; declare @BillNumber varchar(10); declare @BillSeries varchar(5);
select @Neg_Id=n1.Negotiation_Id, @BillNumber=n1.Bill_Number, @BillSeries=bt.Bill_Series from Negotiations n1, Bill_Types bt where n1.Session_Id is null and n1.Holder_Id=@HolderId and n1.Bill_Type=bt.Bill_Type and bt.Bill_Value=@BillValue order by dbo.i_now_i();
if @Neg_Id=null
  begin
    insert into Errors (ERROR_PROCEDURE, ERROR_Var) values ('prGetBillsToReserve', convert(nvarchar(50), @SessionId)+' '+convert(nvarchar(5), @BillValue)+' не удалось найти свободного векселя');
     return 1;
  end
update  Negotiations set Session_Id = @SessionId where Negotiation_Id=@Neg_Id;
if @@ROWCOUNT=0 
  begin
    insert into Errors (ERROR_PROCEDURE, ERROR_Var) values ('prGetBillsToReserve', convert(nvarchar(50), @SessionId)+' '+convert(nvarchar(50), @BillValue));
     return 1;
  end
select @BillSeries + replicate('0', 6 - len(convert(varchar(6), @BillNumber))) + convert(varchar(6), @BillNumber) AS FullBillNumber from vNegotiationsAll n where n.Session_Id=@SessionId;


Эта процедура отрабатывает стабильно хорошо - ошибки не валятся в лог.


Но в другой процедуре, которая последовательно вызывается после второй, в запросе:

    select @NegotiationId=Negotiation_Id, @BillType=Bill_Type from Negotiations where Session_Id=@SessionId;


Периодически @NegotiationId равен null.... Почему?
18 ноя 16, 14:22    [19908105]     Ответить | Цитировать Сообщить модератору
 Re: SELECT только с третьего-пятого раза  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
AlexSYSka, а в чем вы смотрите изменение данных?
В Management Studio или в своём web-приложении?
19 ноя 16, 13:19    [19911372]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить