複数のタスクでストアドプロシージャを実行しようとしていますが、キャッシュからデータを取得している可能性があります。スレッド内のデータを読み取ると同じレコードが返される
var entities = new PhonePushEntities();
var lst = Task.Run(() => entities.GetInAppAlertBatch("ios", DataPacketSize).ToList());
このコードはまた、親タスクで実行されている:
は、ここに私のコードです。
ストアドプロシージャ:
ALTER PROCEDURE [dbo].[GetInAppAlertBatch]
@DeviceType as varchar(10),
@PSize as int
AS
BEGIN
SET NOCOUNT ON;
begin tran InApp_Fetch_Process
declare @t as TABLE (id int)
insert into @t
SELECT top (@PSize) sKey FROM InAppAlerts
where JobStatus = 'pending' AND DeviceType = @DeviceType
UPDATE InAppAlerts
SET JobStatus = 'inprocess'
where sKey in (SELECT id from @t)
select * from InAppAlerts where sKey in (select id from @t)
COMMIT TRAN InApp_Fetch_Process
END
私の質問は、論理的である:我々はストアドプロシージャを見れば、そのたびに、それは、ユニークなデータを返す必要がありますが、それはいくつかのスレッドの同じレコードを返しています。
そして、質問は何ですか?または何が間違っていますか?何を手助けする必要がありますか? –
@DawidFerenczy、私たちがSPを見ると論理的にユニークなデータを与える必要がありますが、あるスレッドでは同じレコードを与えています。 – imlim
* N *個のスレッド/タスクを同時に実行すると、結果が同じになることはありますか?それはあなたの構造を考えると意味をなさないでしょう。トランザクションは更新時にブロックされますが、本質的に同じレコードのリストを更新します。 –