Sql事务在vb.net中不回滚

Sql事务在vb.net中不回滚,sql,sql-server,vb.net,transactions,Sql,Sql Server,Vb.net,Transactions,我在下面代码中的insert语句中故意触发了一个SqlException,并将正确的列名ModifiedBy替换为ModifiedB您需要在事务中包装整个SQL代码。举个例子: create table errTest ( intVal int ) insert into errTest select 1 insert into errTest select 1/0 select * from errTest --one record 第二次插入失败,但由于没有显式启动任何事务,因此每个插

我在下面代码中的insert语句中故意触发了一个
SqlException
,并将正确的列名
ModifiedBy
替换为
ModifiedB

您需要在事务中包装整个SQL代码。举个例子:

create table errTest
(
intVal int
)

insert into errTest select 1
insert into errTest select 1/0
select * from errTest  --one record
第二次插入失败,但由于没有显式启动任何事务,因此每个插入本身就是它自己的事务。第一个成功,第二个失败,表最终保留成功的插入

如果在事务中包装了所有插入,并且启用了
xact\u abort
,则任何插入引发的任何错误都将导致整个事务回滚:

create table errTest
(
intVal int
)

set xact_abort on
begin transaction
    insert into errTest select 1
    insert into errTest select 1/0
commit transaction
select * from errTest  --zero records

您需要将事务和连接传递给希望在SQL事务中使用的所有命令,这是我的示例(我使用记事本删除了一些内容,以便在studio中可能会出现错误)


看起来您并没有实际使用该事务。您正在开始,但当您调用非查询函数时,我看不到命令是在哪里添加到事务中的,而不仅仅是在执行,这就解释了为什么回滚不会撤消任何操作。您的意思是事务和非查询命令使用相同的连接吗?每个非查询方法在局部变量中打开连接,然后在单独的类中执行命令后立即关闭连接。你能发布一些代码来强调你在评论中的建议吗…谢谢。。。。
Private Sub main()
    Using sql_conn
    sql_conn.Open()
    Dim SQL_transaction_INPUT As SqlClient.SqlTransaction = sql_conn.BeginTransaction

    Try
        Dim isOK as Boolean = False
        isOK = update_BSE(myID, sql_conn, SQL_transaction_INPUT)

        If isOK Then
            SQL_transaction_INPUT.Commit()
            sql_conn.Close()
        Else
            SQL_transaction_INPUT.Rollback()
            sql_conn.Close()
        End If

    Catch ex As Exception

        SQL_transaction_INPUT.Rollback()
        If sql_conn.State = ConnectionState.Open Then sql_conn.Close()

    End Try
    End Using
End Sub

Private Function update_BSE(ByVal _IDmod As Integer, _
       ByVal conn_with_trans As SqlConnection, _
       ByVal conn_transaction As SqlTransaction) As Boolean

    Dim ins As String = "UPDATE something WHERE IDrec = @IDmod"
    Dim cmdINS As New SqlCommand(ins, conn_with_trans, conn_transaction)

    Try

        With cmdINS.Parameters
            .Add("IDmod", SqlDbType.Int).Value = _IDmod
        End With
        cmdINS.ExecuteNonQuery()

        Return True

    Catch ex As Exception
        Return False
    End Try
End Function