• 数据库事务


    数据库事务定义

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

    数据库事物语法

    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();
        }
    }
    

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

  • 相关阅读:
    Study Plan The FortyEighth Day
    原码与补码
    【innoDB】加锁案例分析
    【InnoDB】事务基础知识
    了解 CAP
    妙用位运算
    Go学习笔记
    .NET Hot Reload热重载
    .NET 6 中的 dotnet monitor
    C# 实现多线程的同步方法详解
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/7509132.html
Copyright © 2020-2023  润新知