471,348 Members | 1,942 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,348 software developers and data experts.

SQLTransaction rollback issue

Hi,

I am having problems with rollback using the SQLTransaction object. I
am trying to insert records in two tables in a transaction. I want to
rollback all the changes if any exception occurs in any of the inserts.
But the SQLTransaction object only rolls back the inserts that happen
before an exception. All inserts after the exception go through. What
am I doing wrong? Is it that I cannot do any more Inserts using the
transaction object once the exception is thrown? I need to rollback at
the first exception?

Here is my code snippet

==================================================

Dim cnTracker As New
SqlConnection(System.Configuration.ConfigurationSe ttings.AppSettings.Item("sqlconntracker"))
Dim cmdTracker As New SqlCommand
Dim transTracker As SqlTransaction
Dim sSQL As String
Dim bError As Boolean
cnTracker.Open()
cmdTracker.Connection = cnTracker
transTracker = cnTracker.BeginTransaction(IsolationLevel.ReadComm itted)
cmdTracker.Transaction = transTracker

bError = False
Try
'This Statement get rolled back
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Tiffany Havlicek', 215,
4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This statement causes an exception
sSQL = "insert into tblPortfolio (nClientID , Allocation_Date_74_6,
Land_Manager_81_11) VALUES (215, convert(datetime, 'assas') , 2996)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This Statement does NOT get rolled back!!!!
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Riaan', 215, 4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

If (bError) Then
transTracker.Rollback()
Else
transTracker.Commit()
End If

Jul 21 '05 #1
2 2599
What's possibly happening is that the transaction is automatically being
rolled back when the exception occurs. You then carry on with the next
statement as part of a new transaction. This is just a theory though :-)

One simple way around your problem is to just use a single try, catch block.
When an exception occurs roll the transaction back. Because there's only a
single catch block the subsequent statements won't even be executed
James

"ma*************@gmail.com" wrote:
Hi,

I am having problems with rollback using the SQLTransaction object. I
am trying to insert records in two tables in a transaction. I want to
rollback all the changes if any exception occurs in any of the inserts.
But the SQLTransaction object only rolls back the inserts that happen
before an exception. All inserts after the exception go through. What
am I doing wrong? Is it that I cannot do any more Inserts using the
transaction object once the exception is thrown? I need to rollback at
the first exception?

Here is my code snippet

==================================================

Dim cnTracker As New
SqlConnection(System.Configuration.ConfigurationSe ttings.AppSettings.Item("sqlconntracker"))
Dim cmdTracker As New SqlCommand
Dim transTracker As SqlTransaction
Dim sSQL As String
Dim bError As Boolean
cnTracker.Open()
cmdTracker.Connection = cnTracker
transTracker = cnTracker.BeginTransaction(IsolationLevel.ReadComm itted)
cmdTracker.Transaction = transTracker

bError = False
Try
'This Statement get rolled back
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Tiffany Havlicek', 215,
4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This statement causes an exception
sSQL = "insert into tblPortfolio (nClientID , Allocation_Date_74_6,
Land_Manager_81_11) VALUES (215, convert(datetime, 'assas') , 2996)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This Statement does NOT get rolled back!!!!
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Riaan', 215, 4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

If (bError) Then
transTracker.Rollback()
Else
transTracker.Commit()
End If

Jul 21 '05 #2
You might also try taking the problem back to the root, e.g. SQL server. If
you were to use a Stored Procedure with params, then let the SProc handle the
inserts, you can write Error detection into the code to prevent the
subsequent commandes being processed.
Just another way of thinking about the problem.
"ma*************@gmail.com" wrote:
Hi,

I am having problems with rollback using the SQLTransaction object. I
am trying to insert records in two tables in a transaction. I want to
rollback all the changes if any exception occurs in any of the inserts.
But the SQLTransaction object only rolls back the inserts that happen
before an exception. All inserts after the exception go through. What
am I doing wrong? Is it that I cannot do any more Inserts using the
transaction object once the exception is thrown? I need to rollback at
the first exception?

Here is my code snippet

==================================================

Dim cnTracker As New
SqlConnection(System.Configuration.ConfigurationSe ttings.AppSettings.Item("sqlconntracker"))
Dim cmdTracker As New SqlCommand
Dim transTracker As SqlTransaction
Dim sSQL As String
Dim bError As Boolean
cnTracker.Open()
cmdTracker.Connection = cnTracker
transTracker = cnTracker.BeginTransaction(IsolationLevel.ReadComm itted)
cmdTracker.Transaction = transTracker

bError = False
Try
'This Statement get rolled back
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Tiffany Havlicek', 215,
4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This statement causes an exception
sSQL = "insert into tblPortfolio (nClientID , Allocation_Date_74_6,
Land_Manager_81_11) VALUES (215, convert(datetime, 'assas') , 2996)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

Try
'This Statement does NOT get rolled back!!!!
sSQL = "INSERT INTO [tblContacts] ([txtContactName], [nClientID],
[nClientFieldID], [bDefaultValue]) VALUES ('Riaan', 215, 4069, NULL)"
cmdTracker.CommandType = CommandType.Text
cmdTracker.CommandText = sSQL
cmdTracker.ExecuteNonQuery()
Catch ex As Exception
bError = True
End Try

If (bError) Then
transTracker.Rollback()
Else
transTracker.Commit()
End If

Jul 21 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by mahajan.sanjeev | last post: by
5 posts views Thread by Swami Muthuvelu | last post: by
2 posts views Thread by mahajan.sanjeev | last post: by
reply views Thread by eric.goforth | last post: by
1 post views Thread by Jason Huang | last post: by
2 posts views Thread by Ian Boyd | last post: by
2 posts views Thread by samuelberthelot | last post: by
reply views Thread by shalini | last post: by
1 post views Thread by Ronak mishra | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.