2017-06-14 5 views
0

Ich habe ein seltsames Problem mit Transaktionssperre und ich kann nicht darauf hinweisen, wo das Problem kommt.. NET Transaktionssperre Problem

Unser Kunde berichtete, dass sie eine Seite des Systems nicht verwenden können, und es gab Zeitüberschreitung. Diese Seite führt eine gespeicherte Prozedur aus, die CTE, aber keine Transaktionen enthält. Siehe meine gespeicherten Prozedur unter:

ALTER PROCEDURE [dbo].[X_WMS_GET_SALESORDERS_CUSTOM] 
@SelectedLocations VARCHAR(100) = null, 
@FromDueDate DateTime= NULL, 
@ToDueDate DateTime = NULL, 
@SearchTerm VARCHAR(200) = NULL, 

-- Dynamic filters 
-- * Display name will be the parameter name without the @FILTER_ and underscores(_) are replaced by white space(). 
-- * BIT datatype is the equivalent of boolean or char(1) 'Y' or 'N'. This will display a Yes/No dropdown selection on UI. 
@FILTER_Order_Date_from DATETIME = NULL, 
@FILTER_Order_Date_to DATETIME = NULL, 
@FILTER_Account VARCHAR(200) = NULL, 
@FILTER_Locked BIT = NULL, 
@FILTER_Stocks_Ready BIT = NULL, 
@FILTER_Zones VARCHAR(MAX) = NULL, 

-- Pagination parameters 
@START INT = 0, 
@LENGTH INT = 0, -- // 0 = ALL 
@SEARCH VARCHAR(250) = '', 
@SORTCOLUMN VARCHAR(250) = 'Order No', 
@SORTDIRECTION INT = 0 -- // ASC = 0, DESC <> 0 
AS 
BEGIN 

DECLARE @ZONEDESC VARCHAR(50) 

SELECT @ZONEDESC = X_DESCRIPTION FROM X_WMS_ZONES WHERE X_ZONE_ID = @FILTER_Zones; 
-- select * from X_WMS_SALESORD_VW 

WITH TEMPCTE_RESULTS as (

    SELECT '' AS [__HiddenColumns__|ACCNO|LOCNO|] 

     ,SH.SEQNO AS [Order No] 
     ,DR.ACCNO 
     ,DR.NAME AS Account 
     ,SL.LOCATION as [LOCNO] 
     ,MAX(SLOC.LNAME) AS Location 
     ,SH.ORDERDATE AS [Order Date] 
     ,SH.DUEDATE AS [Due Date]    
     ,CASE WHEN RECORDID IS NULL THEN 'N' ELSE 'Y' END AS [Locked] 
     ,CASE WHEN SUM(ISNULL(BA.SOH,0) - ISNULL(BA.TOPICK, 0)) > 0 THEN 'Y' ELSE 'N' END AS [Stocks Ready] 

     ,STUFF((SELECT ', ' + _XZ.X_DESCRIPTION 
      FROM SALESORD_LINES _SL 
      LEFT JOIN (SELECT * from(select *, ROW_NUMBER() OVER (PARTITION BY StockCode ORDER BY Preference ASC) AS rn FROM X_WMS_BIN_ASSIGNMENT WITH(NOLOCK)) BAIN where rn=1 ) _BA ON _BA.STOCKCODE = _SL.STOCKCODE 
      LEFT JOIN dbo.X_WMS_BIN_LOCS AS _BL WITH(NOLOCK) ON _BL.BINID = _BA.BINID 
      LEFT JOIN dbo.X_WMS_ZONES AS _XZ WITH(NOLOCK) ON _XZ.X_ZONE_ID = _BL.ZONEID 
      WHERE  (_SL.HDR_SEQNO = SH.SEQNO) 
      GROUP BY _XZ.X_DESCRIPTION 
      ORDER BY _XZ.X_DESCRIPTION FOR XML PATH(''), TYPE).value('(./text())[1]', 'VARCHAR(MAX)'), 1, 2, '') AS Zones 

     ,ROW_NUMBER() OVER(ORDER BY 
      CASE WHEN @SORTCOLUMN = 'SEQNO' AND @SORTDIRECTION = 0 THEN SH.SEQNO END ASC, 
      CASE WHEN @SORTCOLUMN = 'SEQNO' AND @SORTDIRECTION <> 0 THEN SH.SEQNO END DESC, 
      CASE WHEN @SORTCOLUMN = 'NAME' AND @SORTDIRECTION = 0 THEN DR.NAME END ASC, 
      CASE WHEN @SORTCOLUMN = 'NAME' AND @SORTDIRECTION <> 0 THEN DR.NAME END DESC, 
      CASE WHEN @SORTCOLUMN = 'LOCNAME' AND @SORTDIRECTION = 0 THEN MAX(SLOC.LNAME) END ASC, 
      CASE WHEN @SORTCOLUMN = 'LOCNAME' AND @SORTDIRECTION <> 0 THEN MAX(SLOC.LNAME) END DESC, 
      CASE WHEN @SORTCOLUMN = 'ORDERDATE' AND @SORTDIRECTION = 0 THEN SH.ORDERDATE END ASC, 
      CASE WHEN @SORTCOLUMN = 'ORDERDATE' AND @SORTDIRECTION <> 0 THEN SH.ORDERDATE END DESC, 
      CASE WHEN @SORTCOLUMN = 'DUEDATE' AND @SORTDIRECTION = 0 THEN SH.DUEDATE END ASC, 
      CASE WHEN @SORTCOLUMN = 'DUEDATE' AND @SORTDIRECTION <> 0 THEN SH.DUEDATE END DESC, 
      CASE WHEN @SORTCOLUMN = 'LOCKED' AND @SORTDIRECTION = 0 THEN CASE WHEN RECORDID IS NULL THEN 'N' ELSE 'Y' END END ASC, 
      CASE WHEN @SORTCOLUMN = 'LOCKED' AND @SORTDIRECTION <> 0 THEN CASE WHEN RECORDID IS NULL THEN 'N' ELSE 'Y' END END DESC, 
      CASE WHEN @SORTCOLUMN = 'STOCKS READY' AND @SORTDIRECTION = 0 THEN CASE WHEN SUM(ISNULL(BA.SOH,0) - ISNULL(BA.TOPICK, 0)) > 0 THEN 'Y' ELSE 'N' END END ASC, 
      CASE WHEN @SORTCOLUMN = 'STOCKS READY' AND @SORTDIRECTION <> 0 THEN CASE WHEN SUM(ISNULL(BA.SOH,0) - ISNULL(BA.TOPICK, 0)) > 0 THEN 'Y' ELSE 'N' END END DESC, 
      SH.SEQNO ASC 
     ) AS ROWNUM 
     ,COUNT(*) OVER() AS TotalCount 
     ,COUNT(*) OVER() AS TotalFilteredCount 

    FROM dbo.SALESORD_HDR AS SH 

     INNER JOIN dbo.DR_ACCS AS DR WITH(NOLOCK) ON DR.ACCNO = SH.ACCNO 
     INNER JOIN dbo.SALESORD_LINES AS SL WITH(NOLOCK) ON SL.HDR_SEQNO = SH.SEQNO AND SL.UNSUP_QUANT > 0 
     INNER JOIN STOCK_ITEMS SI WITH(NOLOCK) ON SI.STOCKCODE = SL.STOCKCODE 
     LEFT OUTER JOIN dbo.OBJECT_LOCK WITH(NOLOCK) ON dbo.OBJECT_LOCK.OBJECT_ID = 'Order' AND dbo.OBJECT_LOCK.RECORDID = SH.SEQNO 
     LEFT OUTER JOIN dbo.X_WMS_PICK_DETAILS PD WITH(NOLOCK) ON PD.ORDERNO = SL.HDR_SEQNO AND PD.SOLINEID = SL.SOLINEID 
     INNER JOIN dbo.STOCK_LOCATIONS AS SLOC WITH(NOLOCK) ON SLOC.X_WMS_USE = 1 AND SLOC.LOCNO = SL.LOCATION 
     --LEFT OUTER JOIN dbo.X_WMS_SALESORD_LINES_STOCKQTYAVAIL_VW AS SOLSQA ON SOLSQA.HDR_SEQNO = SH.SEQNO 
     LEFT OUTER JOIN (SELECT * from(select *, ROW_NUMBER() OVER (PARTITION BY StockCode ORDER BY Preference ASC) AS rn FROM X_WMS_BIN_ASSIGNMENT WITH(NOLOCK)) BAIN where rn=1 ) BA ON BA.STOCKCODE = SL.STOCKCODE 
     INNER JOIN X_WMS_BIN_LOCS BL WITH(NOLOCK) ON BL.BINID= BA.BINID AND BL.LOCATION = SL.LOCATION 
      WHERE 1=1 
     AND (SH.STATUS IN (0, 1)) 
     AND (SH.ONHOLD <> 'Y') 
     AND (SH.LAST_UPDATED < DATEADD(SECOND, - 5, GETDATE())) 
     AND (SL.ORD_QUANT > 0) 
     AND (SL.LINETYPE <> 2) 
     AND (SL.STOCKCODE <> SL.LINKED_STOCKCODE or (SI.STATUS <> 'L')) 

     AND (@SelectedLocations='0' OR @SelectedLocations IS NULL OR @SelectedLocations = '' OR SL.LOCATION IN (SELECT ID FROM StringToIntList(@SelectedLocations,','))) 
     AND (@FromDueDate IS NULL OR SH.DUEDATE >= @FromDueDate) 
     AND (@ToDueDate IS NULL OR SH.DUEDATE <= @ToDueDate) 
     AND (@SearchTerm IS NULL 
      OR CONVERT(VARCHAR, SH.SEQNO) LIKE '%' + @SearchTerm + '%' 
      OR CONVERT(VARCHAR,DR.ACCNO) LIKE '%' + @SearchTerm + '%' 
      OR DR.NAME LIKE '%' + @SearchTerm + '%') 
     --AND SL.LOCATION IN(SELECT LOCNO FROM STOCK_LOCATIONS WHERE X_WMS_USE = 1 and X_WMS_INCLUDEONPICK= 1) 

     -- Dynamic filters 
     AND (@FILTER_Order_Date_from IS NULL OR SH.ORDERDATE >= @FILTER_Order_Date_from) 
     AND (@FILTER_Order_Date_to IS NULL OR SH.ORDERDATE <= @FILTER_Order_Date_to) 
     AND (@FILTER_Account IS NULL OR DR.NAME LIKE '%' + @FILTER_Account + '%') 
     AND (@FILTER_Locked IS NULL OR CASE WHEN RECORDID IS NULL THEN 0 ELSE 1 END = @FILTER_Locked) 


     --AND (@ZONES IS NULL OR SLSZ.STOCKZONES LIKE '%' + @ZONEDESC + '%') 
     AND (PD.PICKQTY IS NULL OR(PD.PICKQTY < SL.ORD_QUANT) OR (PD.PICKQTY=0 and PD.QTYREGISTER=0)) 
     GROUP BY SH.SEQNO, DR.ACCNO, DR.NAME, SL.LOCATION, SH.ORDERDATE, SH.DUEDATE, dbo.OBJECT_LOCK.RECORDID 
     HAVING (SUM(SL.ORD_QUANT) - SUM(SL.SUP_QUANT) - SUM(SL.BKORD_QUANT) - SUM(ISNULL(PD.PICKQTY, 0)) > 0) 
     AND (@FILTER_Stocks_Ready IS NULL OR CASE WHEN SUM(ISNULL(BA.SOH,0) - ISNULL(BA.TOPICK, 0)) > 0 THEN 1 ELSE 0 END = @FILTER_Stocks_Ready) 
) 

-- 

SELECT _TR.* 
INTO #TMP 
FROM TEMPCTE_RESULTS _TR 
WHERE 1=1 
    AND (ISNULL(@LENGTH, 0) = 0 OR ROWNUM BETWEEN @START + 1 AND (@START + @LENGTH)) 
ORDER BY ROWNUM 

IF(ISNULL(@FILTER_Zones,'') != '') 
BEGIN 
    UPDATE #TMP SET ZONES = @ZONEDESC 
END 
SELECT * FROM #TMP 

DROP TABLE #TMP 


END 

Während der Seite noch nach unten ist Ich habe versucht, die gespeicherte Prozedur manuell auf SQL Management ausgeführt und führt innerhalb von 1 oder 2 Sekunden ohne Probleme. Ich verwende ASP.Net MVC, um das Ergebnis dieser gespeicherten Prozedur anzuzeigen.

Ich habe den Server neu gestartet, aber das Problem besteht immer noch. Der einzige Weg, den ich in der Lage war, es zu lösen, bestand darin, jede Zeile der gespeicherten Prozedur zu ändern, sie auszuführen und die Änderungen rückgängig zu machen und erneut auszuführen, dann löst es das Problem auf magische Weise auf.

Hat jemand dies festgestellt? Jede Hilfe wäre sehr dankbar, da ich war fragen morgen zu berichten, was gerade passiert ist, und ich brauche etwas auf unserer Konferenz zu sagen :(

TIA

+0

anzeigen Wie rufen Sie die SP von Ihrem C# -Code aus? Zeigen Sie uns auch, wie Sie sie aus der SQL-Verwaltung aufrufen. – mjwills

+0

Führt das Ausführen von 'sp_recompile' das Problem aus? https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-recompile-transact-sql – mjwills

+0

Ich denke, es war auf der # tmp, die Deadlock aus dem gleichen verursacht Verbindung, wenn es von dem .Net aufgerufen wird. –

Antwort

0
  1. An manchen Orten haben Sie verwendet „select *“, nur die gewünschte Spalte auswählen. 2.Monitor Ihre Abfrage von SQL Profiler oder Aktivitätsmonitor, wenn es von Seite getroffen wird. 3. wenn Sie Deadlock konfrontiert sind, überwachen sie von SQL Profiler genauen Grund zu kennen.