sql - unexpected lock on index in mssql in select queries -


i keep getting

caused by: java.sql.sqlexception: transaction (process id 61) deadlocked on lock resources process , has been chosen deadlock victim. rerun transaction. 

so turned on mssql logging using

dbcc traceon(1222,-1) dbcc traceon(1204,-1) 

and following deadlock info printed in logs:

these line indicate deadlock has been detected, , process 1 has been chosen victim.

process-list deadlock victim=process_id_1 deadlock-list 

logs of process_id_1

   [1] (@p0 nvarchar(4000))select namesequen0_.id id1_47_<c/> namesequen0_.container_id containe9_47_<c/> namesequen0_.increment_ incremen2_47_<c/> namesequen0_.nextvalue nextvalu3_47_<c/> namesequen0_.numchars numchars4_47_<c/> namesequen0_.padchar padchar5_47_<c/> namesequen0_.scope scope6_47_<c/> namesequen0_.sequencetype sequence7_47_<c/> namesequen0_.uppercase uppercas8_47_ namesequence namesequen0_ (namesequen0_.scope  @p0 ) , (namesequen0_.container_id null)             [2] frame procname=adhoc line=1 stmtstart=40 sqlhandle=0x020000005734e00acfb3060d49cc0e8565acb3b105807744     [3] executionstack     [4] process id=process_id_1 taskpriority=0 logused=1248 waitresource=key: 14:72057594053459968 (95c9fddfaf17) waittime=3506 ownerid=13645568 transactionname=implicit_transaction lasttranstarted=2015-06-02t07:52:41.660 xdes=0xa30dd950 lockmode=s schedulerid=1 kpid=1848 status=suspended spid=68 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-06-02t07:52:41.663 lastbatchcompleted=2015-06-02t07:52:41.660 clientapp=jtds hostname=qalab6 hostpid=123 loginname=qalab6_nrm isolationlevel=read committed (2) xactid=13645568 currentdb=14 locktimeout=4294967295 clientoption1=671088672 clientoption2=128058 

logs of process_id_2

[1]select card0_.id id2_77_<c/> card0_.autodisplayname autodisp3_77_<c/> card0_.autopartialname autopart4_77_<c/> card0_.namedwithsequence_id namedwi38_77_<c/> card0_.namedwithsequencevalue namedwit5_77_<c/> card0_.userdisplayname userdisp6_77_<c/> card0_.userpartialname userpart7_77_<c/> card0_.lifecyclestate_id lifecyc40_77_<c/> card0_.model_id model41_77_<c/> card0_.outofservice outofse12_77_<c/> card0_.bottomclearance bottomc13_77_<c/> card0_.leftclearance leftcle14_77_<c/> card0_.rightclearance rightcl15_77_<c/> card0_.topclearance topclea16_77_<c/> card0_.ncmelementkey ncmelem24_77_ vfditem card0_ card0_.dtype='card' , card0_.ncmelementkey= @p0 [2]frame procname=adhoc line=1 stmtstart=40 sqlhandle=0x02000000386ba721896ce39b0b7c9d01df11539c0d843c83 [3]executionstack [4]process id=process_id_2 taskpriority=0 logused=62048 waitresource=key: 14:72057594051297280 (fadae9b0c9d3) waittime=3333 ownerid=13645330 transactionname=implicit_transaction lasttranstarted=2015-06-02t07:52:39.570 xdes=0xbf9f5950 lockmode=s schedulerid=1 kpid=5344 status=suspended spid=66 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-06-02t07:52:41.833 lastbatchcompleted=2015-06-02t07:52:41.813 clientapp=jtds hostname=qalab6 hostpid=123 loginname=qalab6_nrm isolationlevel=read committed (2) xactid=13645330 currentdb=14 locktimeout=4294967295 clientoption1=671088672 clientoption2=128058 

now following line gives details of process_id_1,

ref[1] query want execute...note: select query on table name namesequence , namesequence0_.container_id foreign key table name vfditem.

ref[4] says waiting resource , suspended


now following line give details of process_id_2 in deadlock process_id_1

ref[1] give query process_id_2 want run...note select query on table name vfditem , card0_.namedwithsequence_id foreign key table name namesequence

ref[4] says waiting resource , suspended


now following lines prints resource locked , whom , waiting resource.

[11] waiter id=process_id_2 mode=s requesttype=wait [10] waiter-list [9] owner id=process_id_1 mode=x [8] owner-list [7] keylock hobtid=72057594051297280 dbid=14 objectname=qalab6_nrm.dbo.vfditem indexname=vfditem_pk id=lock85330d00 mode=x associatedobjectid=72057594051297280 [6] waiter id=process_id_1 mode=s requesttype=wait [5] waiter-list [4] owner id=process_id_2 mode=x [3] owner-list [2] keylock hobtid=72057594053459968 dbid=14 objectname=qalab6_nrm.dbo.namesequence indexname=namesequence_pk id=lock848c3380 mode=x associatedobjectid=72057594053459968 [1] resource-list 

this translates

[1] resource qalab6_nrm.dbo.namesequence indexname=namesequence_pk locked process_id_2 in exclusive lock mode , process_id_1 waiting on it.

[2] resource qalab6_nrm.dbo.vfditem indexname=vfditem_pk locked process_id_1 in exclusive lock mode , process_id_2 waiting on it.


bingo can see how been deadlocked


now weird part

if closely process_id_1 trying run select query table name namesequence , column namesequence.container_id foreign key table vfditem , process_id_1 has acquired lock on indexname=vfditem_pk of vfditem table

[1] why process_is_1 acquire lock on index of vfditem ?

further process_id_2 trying run select query table name vfditem , column vfditem.namesequence_id foreign key table namesequence , process_id_2 has acquired lock on indexname=namesequence_pk of namesequence table

[2] why process_is_2 acquire lock on index of namesequence?

mssql uses locking on select statements, can table, page , row locks. depends on want in system , more important pointer along way @ table hints can put on select statement, looking @ nowait, nolock, readcommitted , read_committed_snapshot

you may want consider setting isolation level on of transactions avoid issue in other places.

this pretty basic information , dba may able provide more detailed answer, these options prevent issue happening

you can tell isolation level running dbcc useroptions , can tell read_committed_snapshot running select is_read_committed_snapshot_on sys.databases name= 'yourdatabase'


Comments