January 15, 2010 at 6:39 am
I wonder if anybody can can provide answers to these questions:
1) Is there any point in using NOLOCK on queries in a database which doesn't use transactions?
2) How can deadlocks appear in a database which doesn't use transactions?
January 15, 2010 at 7:02 am
All queries use transactions. If you don't explicitly start a transaction, one is automatically started at the beginning of a statement and automatically committed if the query finishes without error.
As for nolock, make sure you understand what it does before using it. It's not a way to make queries faster, it's a way to get data without caring if it's accurate or not. See - http://sqlblog.com/blogs/andrew_kelly/archive/2009/04/10/how-dirty-are-your-reads.aspx
As for deadlocks, yes there are cases where you can get deadlocks without explicit transactions. If you're experiencing deadlocks, switch traceflag 1222 on. That will result in a deadlock graph been written to the error log every time a deadlock occurs. Post the result of that graph here.
DBCC TRACEON(1222,-1)
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
January 15, 2010 at 7:26 am
You say your database isn't using transactions. Are you running INSERT, UPDATE, and DELETE statements in the database? If so, you are using transactions. You may not be using EXPLICIT transactions, but instead using IMPLICIT transactions.
You may want to run a google search on ssc, you'll find quite a lot of discussions regarding using NOLOCK and the problems that may be encountered because of using it.
January 15, 2010 at 7:40 am
andy 21711 (1/15/2010)
2) How can deadlocks appear in a database which doesn't use transactions?
Triggers can cause this
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537January 15, 2010 at 11:04 am
Hi Everybody,
Thanks for your replies. I realise there are autocommit transactions, but since they are each one statement long, how can there be deadlocks unless one statement manages to access two or more resources and conflicts with another statement that accesses the same resources in a different order?
Here are two queries we have run in different SQL Management Studio windows:
declare @count int
set @count = 1
while (@count < 10000000)
begin
select * from dealmaster where serial_no = 9100093
set @count = @count + 1
end
... and ...
declare @count int
set @count = 1
while (@count < 10000000)
begin
update dealmaster set stoplock = stoplock where serial_no = 9100093
set @count = @count + 1
end
This gives rise to a deadlock. WHY? There are no triggers. We have tried it with different combinations: adding extra columns, using different numbers of rows (between 1 and 500K), etc.
The table's definition is
CREATE TABLE [dbo].[dealmaster](
[ID] [int] IDENTITY(1,1) NOT NULL,
[serial_no] [int] NOT NULL,
[stoplock] [int] NULL,
CONSTRAINT [PK_dealmaster] PRIMARY KEY CLUSTERED
(
[serial_no] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
January 15, 2010 at 11:15 am
I forgot to send the deadlock graph, so here it is:
<?xml version="1.0" encoding="utf-16" ?>
- <TraceData xmlns="http://tempuri.org/TracePersistence.xsd">
- <Header>
<TraceProvider name="Microsoft SQL Server" MajorVersion="10" MinorVersion="0" BuildNumber="2531" />
<ServerInformation name="ANANTVISTA\SQLSVR2008" />
- <ProfilerUI>
- <OrderedColumns>
<ID>27</ID>
<ID>51</ID>
<ID>60</ID>
<ID>11</ID>
<ID>41</ID>
<ID>12</ID>
<ID>26</ID>
<ID>64</ID>
<ID>14</ID>
<ID>1</ID>
<ID>4</ID>
<ID>10</ID>
<ID>52</ID>
<ID>2</ID>
<ID>9</ID>
<ID>3</ID>
<ID>35</ID>
<ID>13</ID>
<ID>15</ID>
<ID>66</ID>
<ID>8</ID>
<ID>25</ID>
<ID>55</ID>
<ID>32</ID>
<ID>7</ID>
<ID>6</ID>
<ID>22</ID>
<ID>56</ID>
<ID>58</ID>
<ID>49</ID>
<ID>57</ID>
<ID>21</ID>
<ID>5</ID>
<ID>61</ID>
</OrderedColumns>
- <TracedEvents>
- <Event id="148">
<EventColumn id="11" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="14" />
<EventColumn id="26" />
<EventColumn id="60" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="41" />
</Event>
- <Event id="25">
<EventColumn id="7" />
<EventColumn id="15" />
<EventColumn id="55" />
<EventColumn id="8" />
<EventColumn id="32" />
<EventColumn id="56" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="9" />
<EventColumn id="25" />
<EventColumn id="41" />
<EventColumn id="49" />
<EventColumn id="57" />
<EventColumn id="2" />
<EventColumn id="10" />
<EventColumn id="26" />
<EventColumn id="58" />
<EventColumn id="66" />
<EventColumn id="3" />
<EventColumn id="11" />
<EventColumn id="35" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="52" />
<EventColumn id="60" />
<EventColumn id="13" />
<EventColumn id="6" />
<EventColumn id="14" />
<EventColumn id="22" />
</Event>
- <Event id="59">
<EventColumn id="55" />
<EventColumn id="32" />
<EventColumn id="56" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="21" />
<EventColumn id="25" />
<EventColumn id="41" />
<EventColumn id="49" />
<EventColumn id="57" />
<EventColumn id="2" />
<EventColumn id="14" />
<EventColumn id="22" />
<EventColumn id="26" />
<EventColumn id="58" />
<EventColumn id="3" />
<EventColumn id="35" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="52" />
<EventColumn id="60" />
</Event>
- <Event id="60">
<EventColumn id="7" />
<EventColumn id="55" />
<EventColumn id="8" />
<EventColumn id="32" />
<EventColumn id="56" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="9" />
<EventColumn id="25" />
<EventColumn id="41" />
<EventColumn id="49" />
<EventColumn id="57" />
<EventColumn id="10" />
<EventColumn id="26" />
<EventColumn id="58" />
<EventColumn id="66" />
<EventColumn id="3" />
<EventColumn id="11" />
<EventColumn id="35" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="60" />
<EventColumn id="5" />
<EventColumn id="21" />
<EventColumn id="61" />
<EventColumn id="6" />
<EventColumn id="14" />
<EventColumn id="22" />
</Event>
- <Event id="27">
<EventColumn id="7" />
<EventColumn id="15" />
<EventColumn id="55" />
<EventColumn id="8" />
<EventColumn id="32" />
<EventColumn id="56" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="9" />
<EventColumn id="41" />
<EventColumn id="49" />
<EventColumn id="57" />
<EventColumn id="2" />
<EventColumn id="10" />
<EventColumn id="26" />
<EventColumn id="58" />
<EventColumn id="66" />
<EventColumn id="3" />
<EventColumn id="11" />
<EventColumn id="35" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="52" />
<EventColumn id="60" />
<EventColumn id="13" />
<EventColumn id="6" />
<EventColumn id="14" />
<EventColumn id="22" />
</Event>
- <Event id="189">
<EventColumn id="7" />
<EventColumn id="15" />
<EventColumn id="55" />
<EventColumn id="8" />
<EventColumn id="32" />
<EventColumn id="56" />
<EventColumn id="64" />
<EventColumn id="1" />
<EventColumn id="9" />
<EventColumn id="41" />
<EventColumn id="49" />
<EventColumn id="57" />
<EventColumn id="2" />
<EventColumn id="10" />
<EventColumn id="26" />
<EventColumn id="58" />
<EventColumn id="66" />
<EventColumn id="3" />
<EventColumn id="11" />
<EventColumn id="35" />
<EventColumn id="51" />
<EventColumn id="4" />
<EventColumn id="12" />
<EventColumn id="52" />
<EventColumn id="60" />
<EventColumn id="13" />
<EventColumn id="6" />
<EventColumn id="14" />
<EventColumn id="22" />
</Event>
</TracedEvents>
</ProfilerUI>
</Header>
- <Events>
- <Event id="65534" name="Trace Start">
<Column id="14" name="StartTime">2010-01-15T16:52:49.637+00:00</Column>
</Event>
- <Event id="27" name="Lock:Timeout">
<Column id="7" name="NTDomainName">ARCDOMAIN1</Column>
<Column id="15" name="EndTime">2010-01-15T16:52:59.99+00:00</Column>
<Column id="55" name="IntegerData2">0</Column>
<Column id="8" name="HostName">ANANTVISTA</Column>
<Column id="32" name="Mode">5</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="64" name="SessionLoginName">ARCDOMAIN1\Anant</Column>
<Column id="9" name="ClientProcessID">7448</Column>
<Column id="41" name="LoginSid">01050000000000051500000092E03C77DBEB0C5007E53B2B350E0000</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="6" name="NTUserName">Anant</Column>
<Column id="10" name="ApplicationName">Microsoft SQL Server Management Studio - Query</Column>
<Column id="14" name="StartTime">2010-01-15T16:52:59.99+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="66" name="GroupID">2</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="11" name="LoginName">ARCDOMAIN1\Anant</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1790</Column>
<Column id="4" name="TransactionID">509336</Column>
<Column id="12" name="SPID">54</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="13" name="Duration">0</Column>
</Event>
- <Event id="27" name="Lock:Timeout">
<Column id="7" name="NTDomainName">ARCDOMAIN1</Column>
<Column id="15" name="EndTime">2010-01-15T16:53:00.05+00:00</Column>
<Column id="55" name="IntegerData2">0</Column>
<Column id="8" name="HostName">ANANTVISTA</Column>
<Column id="32" name="Mode">3</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="64" name="SessionLoginName">ARCDOMAIN1\Anant</Column>
<Column id="9" name="ClientProcessID">7448</Column>
<Column id="41" name="LoginSid">01050000000000051500000092E03C77DBEB0C5007E53B2B350E0000</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="6" name="NTUserName">Anant</Column>
<Column id="10" name="ApplicationName">Microsoft SQL Server Management Studio - Query</Column>
<Column id="14" name="StartTime">2010-01-15T16:53:00.05+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="66" name="GroupID">2</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="11" name="LoginName">ARCDOMAIN1\Anant</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1791</Column>
<Column id="4" name="TransactionID">509335</Column>
<Column id="12" name="SPID">53</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="13" name="Duration">0</Column>
</Event>
- <Event id="27" name="Lock:Timeout">
<Column id="7" name="NTDomainName">ARCDOMAIN1</Column>
<Column id="15" name="EndTime">2010-01-15T16:53:00.05+00:00</Column>
<Column id="55" name="IntegerData2">0</Column>
<Column id="8" name="HostName">ANANTVISTA</Column>
<Column id="32" name="Mode">3</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="64" name="SessionLoginName">ARCDOMAIN1\Anant</Column>
<Column id="9" name="ClientProcessID">7448</Column>
<Column id="41" name="LoginSid">01050000000000051500000092E03C77DBEB0C5007E53B2B350E0000</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="6" name="NTUserName">Anant</Column>
<Column id="10" name="ApplicationName">Microsoft SQL Server Management Studio - Query</Column>
<Column id="14" name="StartTime">2010-01-15T16:53:00.05+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="66" name="GroupID">2</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="11" name="LoginName">ARCDOMAIN1\Anant</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1792</Column>
<Column id="4" name="TransactionID">509335</Column>
<Column id="12" name="SPID">53</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="13" name="Duration">0</Column>
</Event>
- <Event id="59" name="Lock:Deadlock Chain">
<Column id="55" name="IntegerData2">0</Column>
<Column id="32" name="Mode">5</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="1" name="TextData">Deadlock Chain SPID = 54</Column>
<Column id="21" name="EventSubClass">101</Column>
<Column id="25" name="IntegerData">54882</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="14" name="StartTime">2010-01-15T16:53:03.387+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1816</Column>
<Column id="4" name="TransactionID">509336</Column>
<Column id="12" name="SPID">6</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="60" name="IsSystem">1</Column>
</Event>
- <Event id="59" name="Lock:Deadlock Chain">
<Column id="55" name="IntegerData2">0</Column>
<Column id="32" name="Mode">3</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="1" name="TextData">Deadlock Chain SPID = 53</Column>
<Column id="21" name="EventSubClass">101</Column>
<Column id="25" name="IntegerData">54882</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="14" name="StartTime">2010-01-15T16:53:03.387+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1817</Column>
<Column id="4" name="TransactionID">509335</Column>
<Column id="12" name="SPID">6</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="60" name="IsSystem">1</Column>
</Event>
- <Event id="25" name="Lock:Deadlock">
<Column id="7" name="NTDomainName">ARCDOMAIN1</Column>
<Column id="15" name="EndTime">2010-01-15T16:53:03.387+00:00</Column>
<Column id="55" name="IntegerData2">0</Column>
<Column id="8" name="HostName">ANANTVISTA</Column>
<Column id="32" name="Mode">5</Column>
<Column id="56" name="ObjectID2">330848641</Column>
<Column id="64" name="SessionLoginName">ARCDOMAIN1\Anant</Column>
<Column id="9" name="ClientProcessID">7448</Column>
<Column id="25" name="IntegerData">54882</Column>
<Column id="41" name="LoginSid">01050000000000051500000092E03C77DBEB0C5007E53B2B350E0000</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="57" name="Type">5</Column>
<Column id="2" name="BinaryData">8159B8130000000000000000070005</Column>
<Column id="6" name="NTUserName">Anant</Column>
<Column id="10" name="ApplicationName">Microsoft SQL Server Management Studio - Query</Column>
<Column id="14" name="StartTime">2010-01-15T16:52:59.987+00:00</Column>
<Column id="22" name="ObjectID">330848641</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="58" name="OwnerID">1</Column>
<Column id="66" name="GroupID">2</Column>
<Column id="3" name="DatabaseID">7</Column>
<Column id="11" name="LoginName">ARCDOMAIN1\Anant</Column>
<Column id="35" name="DatabaseName">TRADLIVE</Column>
<Column id="51" name="EventSequence">1818</Column>
<Column id="4" name="TransactionID">509336</Column>
<Column id="12" name="SPID">54</Column>
<Column id="52" name="BigintData1">0</Column>
<Column id="13" name="Duration">3401000</Column>
</Event>
- <Event id="148" name="Deadlock graph">
<Column id="1" name="TextData"><deadlock-list> <deadlock victim="process362f000"> <process-list> <process id="process362f000" taskpriority="0" logused="0" waitresource="OBJECT: 7:330848641:0 " waittime="3399" ownerId="509336" transactionname="UPDATE" lasttranstarted="2010-01-15T16:52:59.990" XDES="0x2552b5a0" lockMode="X" schedulerid="2" kpid="7592" status="suspended" spid="54" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2010-01-15T16:52:59.990" lastbatchcompleted="2010-01-15T16:50:35.883" lastattention="2010-01-15T16:46:54.407" clientapp="Microsoft SQL Server Management Studio - Query" hostname="ANANTVISTA" hostpid="7448" loginname="ARCDOMAIN1\Anant" isolationlevel="read committed (2)" xactid="509336" currentdb="7" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"> <executionStack> <frame procname="adhoc" line="8" stmtstart="16" sqlhandle="0x0200000043e0790decd5554f4f4b18bf65aa4a631c8f597c"> UPDATE [deadlocktest] set [stoplock] = [stoplock] WHERE [serial_no]=@1 </frame> <frame procname="adhoc" line="8" stmtstart="314" stmtend="598" sqlhandle="0x02000000446d052579ffab4f407d1807981e9599e6c409d4"> update deadlocktest set stoplock = stoplock where serial_no = 671874 --update dealmaster set stoplock = stoplock where serial_no = 9100093 </frame> </executionStack> <inputbuf> --set implicit_transactions ON declare @count int set @count = 1 while (@count < 10000) begin --select * from dealmaster where serial_no = 9100093 update deadlocktest set stoplock = stoplock where serial_no = 671874 --update dealmaster set stoplock = stoplock where serial_no = 9100093 set @count = @count + 1 --commit end --set ANSI_DEFAULTS off --DBCC USEROPTIONS --dbcc traceon(1205, -1) --dbcc traceon(1204, -1) --dbcc traceon(1222, -1) </inputbuf> </process> <process id="process362fc78" taskpriority="0" logused="0" waitresource="OBJECT: 7:330848641:0 " waittime="3337" ownerId="509335" transactionname="SELECT" lasttranstarted="2010-01-15T16:52:59.890" XDES="0x5933de8" lockMode="S" schedulerid="2" kpid="4440" status="suspended" spid="53" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2010-01-15T16:52:56.907" lastbatchcompleted="2010-01-15T16:51:01.590" lastattention="2010-01-15T16:51:01.647" clientapp="Microsoft SQL Server Management Studio - Query" hostname="ANANTVISTA" hostpid="7448" loginname="ARCDOMAIN1\Anant" isolationlevel="read committed (2)" xactid="509335" currentdb="7" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"> <executionStack> <frame procname="adhoc" line="7" stmtstart="16" sqlhandle="0x02000000a2919a1eddf87f0e2f36bb473ab3d1313f7cb2cb"> SELECT * FROM [deadlocktest] WHERE [SERIAL_NO]=@1 </frame> <frame procname="adhoc" line="7" stmtstart="206" stmtend="566" sqlhandle="0x020000003d486f1c77b69516dff0938529b4b883a002d9e4"> select * from deadlocktest where SERIAL_NO = 671874 --select * from dealmaster where serial_no = 9100093 --update dealmaster set stoplock = stoplock where serial_no = 9100093 </frame> </executionStack> <inputbuf> --set implicit_transactions OFF declare @count int set @count = 1 while (@count < 10000) begin select * from deadlocktest where SERIAL_NO = 671874 --select * from dealmaster where serial_no = 9100093 --update dealmaster set stoplock = stoplock where serial_no = 9100093 set @count = @count + 1 end --set ANSI_DEFAULTS off --DBCC USEROPTIONS ---DBCC DATABASEOPTIONS </inputbuf> </process> </process-list> <resource-list> <objectlock lockPartition="0" objid="330848641" subresource="FULL" dbid="7" objectname="TRADLIVE.dbo.Deadlocktest" id="lock6ed9100" mode="IX" associatedObjectId="330848641"> <owner-list> <owner id="process362fc78" mode="IS"/> </owner-list> <waiter-list> <waiter id="process362f000" mode="X" requestType="convert"/> </waiter-list> </objectlock> <objectlock lockPartition="0" objid="330848641" subresource="FULL" dbid="7" objectname="TRADLIVE.dbo.Deadlocktest" id="lock6ed9100" mode="IX" associatedObjectId="330848641"> <owner-list> <owner id="process362f000" mode="IX"/> </owner-list> <waiter-list> <waiter id="process362fc78" mode="S" requestType="convert"/> </waiter-list> </objectlock> </resource-list> </deadlock> </deadlock-list></Column>
<Column id="11" name="LoginName">sa</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="51" name="EventSequence">1819</Column>
<Column id="12" name="SPID">21</Column>
<Column id="14" name="StartTime">2010-01-15T16:53:03.39+00:00</Column>
<Column id="26" name="ServerName">ANANTVISTA\SQLSVR2008</Column>
<Column id="60" name="IsSystem">1</Column>
</Event>
- <Event id="65533" name="Trace Stop">
<Column id="14" name="StartTime">2010-01-15T16:57:28.5+00:00</Column>
</Event>
</Events>
</TraceData>
January 15, 2010 at 11:29 am
andy 21711 (1/15/2010)
Thanks for your replies. I realise there are autocommit transactions, but since they are each one statement long, how can there be deadlocks unless one statement manages to access two or more resources and conflicts with another statement that accesses the same resources in a different order?
Easy, it's a key-lookup deadlock.
Session 1 runs a query that seeks on a noncovering nonclustered index, then has to do lookup to cluster to get rest of values.
Session 2 runs an update, first updates the cluster, then goes to update the nonclustered index
Hence you can get into the situation where session 1 has a shared lock on a key in a nonclustered index and requests a shared lock on a key in the clustered index while session 2 has an exclusive lock on the key in the clustered index and requests an exclusive lock on the key in the nonclustered index.
Almost a textbook deadlock.
declare @count int
set @count = 1
while (@count < 10000000)
begin
select * from dealmaster where serial_no = 9100093
set @count = @count + 1
end
... and ...
declare @count int
set @count = 1
while (@count < 10000000)
begin
update dealmaster set stoplock = stoplock where serial_no = 9100093
set @count = @count + 1
end
What is this supposed to do? Run the same select and update millions of times? Just testing for deadlocks?
Please post all indexes that table has. Usual fix for this is to widen the nonclustered index so that it's covering, though not feasible when you're doing a select *.
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
January 19, 2010 at 5:09 am
Hi Gail,
Thanks for your reply, which was very illuminating: it certainly hadn't occurred to us that indexes could be involved in deadlocks. However, the scenario you describe doesn't apply in this case: the table doesn't have a non-clustered index, only a clustered one. Is it possible to deadlock in in that case?
You asked what the script is supposed to do: yes, it was just to test for deadlocks.
Andy
January 19, 2010 at 5:38 am
Can you repost that deadlock graph so that it's readable please. Either attach the xml file that profiler produces or use traceflag 1222 and post the output of that.
The one you posted is going to take just too much work to get into a readable form
Gail Shaw
Microsoft Certified Master: SQL Server, MVP, M.Sc (Comp Sci)
SQL In The Wild: Discussions on DB performance with occasional diversions into recoverability
January 19, 2010 at 5:51 am
Hi Gail,
Here's the XML file (if I've managed to attach it correctly).
Andy
January 22, 2010 at 1:25 am
🙂
Viewing 11 posts - 1 through 11 (of 11 total)
You must be logged in to reply to this topic. Login to reply