Go Premium for a chance to win a PS4. Enter to Win

  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3352
  • Last Modified:

catching and handling SQL deadlocks from vb.net

I'm using vb.net 2005 and SQL 2005. Very occasionally I am getting a SQL deadlock - "Transaction (Process ID 258) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."

- how do I check for the deadlock exception in my catch block?
- I am handling the transaction from .NET so I do a trans.commit or trans.rollback. However, in some situations SQL does the rollback itself - in deadlock situations for example. How can I check that my transaction is still 'active' before I attempt to rollback?

            Using tran As SqlTransaction = 						cn.appConnection.BeginTransaction(IsolationLevel.ReadCommitted)	
                    If objtransMasterList.IsDirty Then
                        Dim objTransMaster As SQLTransMaster
                        For Each objTransMaster In objtransMasterList
                            If objTransMaster.IsNew Then
                                Dim cmd As New SqlCommand
                                cmd.CommandText = SQLInsertStoredProc
                                cmd.Connection = cn.appConnection
                                cmd.Transaction = tran
                                cmd.CommandType = CommandType.StoredProcedure
                                saveTransMasterParamsFromObj(cmd, CMDTYPES.INSERT, objTransMaster)
                            End If
                    End If
                Catch a As Exception
                    success = False
                    GoTo finally_Renamed
                End Try
            End Using
        Catch b As Exception
            success = False
            If Not cn.appConnection Is Nothing Then
                If cn.appConnection.State <> ConnectionState.Closed Then cn.CloseConnection()
            End If
        End Try

Open in new window

  • 2
1 Solution
Where did you see ""Transaction (Process ID 258) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.""?

was that in the event log? or can you see this in the exception thrown?
darrenwrightAuthor Commented:
in my catch block I process the error via objSQLErrorList.processError which writes the error to a log file.
of my two part question, I now think I've sorted the first one - I'm just testing it now. I've changed so I catch the sqlexception and check for number 1205. What I need to work out now is second part of question. How can I check whether I need to do a trans.rollback or whether it's already been rolled back by SQL?  

Catch sqlEx As SqlException
    success = False
     If sqlEx.Number = 1205 Then 'deadlock
              mustRetry = True
               retryCount = retryCount + 1S
      End If
Is the tran.rollback() throwing an exception when there is nothing to roll back? if thats the case, put it inside a try/catch block and ignore the error. If there's nothing to rollback (ie the trans.commit executed sucessfully or sql server rolls back automatically like for deadlocks) then it won't roll anything back.

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now