美文网首页
数据库事务

数据库事务

作者: LoveTomato | 来源:发表于2017-09-12 11:19 被阅读0次

    数据库事务

    数据库事务定义

    事物:是有一系列的逻辑语句组成的工作单元,事物保证这一系列语句要么成功执行所有语句,要么都不执行。

    数据库事物语法

    1. 开启事物 begin transaction
    2. 结束事物
    • 提交事物:事物执行成功的时候commit提交事物
    • 事物回滚:事物执行失败时rollback回滚到事物执行前或事物所设置的某个保存点

    例子

    创建学生表

    CREATE TABLE [dbo].[Student](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Number] [nvarchar](50) NULL,
        [Name] [nchar](10) NULL,
        [Age] [int] NULL
    ) 
    

    事物插入两条数据,第二条为非法数据。执行结果两条数据都未插入。执行语句

    declare @ErrorCount int =0;
    begin transaction
    insert into Student([Number] ,[Name],[Age])values('0521','jerry',5);
    set @ErrorCount = @ErrorCount + @@ERROR
    insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello');
    set @ErrorCount = @ErrorCount + @@ERROR
    if @ErrorCount=0
    begin
    commit
    end
    else
    begin
    rollback
    end
    

    事物简单写法

    一大部分书籍或博客都是如上写事物,执行成功commit失败rollback。其感觉好没有必要(认为在没有设回滚点时,
    没必要用rollback),事务已经保证了逻辑单元,之前提交同样可以。

    begin transaction
    insert into Student([Number] ,[Name],[Age])values('0521','jerry',5);
    insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello');
    commit
    

    ADO.Net中应用

    在ado.net 中感觉完全没有必要通过try{}catch(){}事物回滚。

    var conn = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
    string SQL1 = "insert into Student([Number] ,[Name],[Age])values('0521','jerry',5) ";
    string SQL2 = "insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello')";
    
    using (SqlConnection connection = new SqlConnection(conn))
    {
        connection.Open();
        SqlTransaction sqlTran = connection.BeginTransaction();
        SqlCommand command = connection.CreateCommand();
        command.Transaction = sqlTran;
    
        try
        {
            command.CommandText = SQL1;
            int rowsAffected = command.ExecuteNonQuery();
            command.CommandText = SQL2;
            rowsAffected += command.ExecuteNonQuery();
            transaction.Commit();
        }
        catch (Exception ex1)
        {
            //认为没有必要写Rollback
            //transaction.Rollback();
        }
    }
    

    不知观点是否正确,欢迎其他观点讨论。

    相关文章

      网友评论

          本文标题: 数据库事务

          本文链接:https://www.haomeiwen.com/subject/leccsxtx.html