數據庫事務

數據庫事務

數據庫事務定義

事物:是有一系列的邏輯語句組成的工作單元,事物保證這一系列語句要么成功執行所有語句,要么都不執行。

數據庫事物語法

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

不知觀點是否正確,歡迎其他觀點討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 鏈接 事務(Transaction)是并發控制的基本單位。所謂的事務,它是一個操作序列,這些操作要么都執行,要么都...
    yangqi916閱讀 434評論 0 0
  • 1、寫在前面 1.1 為什么要并發控制 如果事務在并發執行時,來自各個并發事務的所有指令的執行控制都是由操作系統負...
    SpaceCat閱讀 9,708評論 0 7
  • 在數據庫中,所謂事務是指一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。 為確保數據庫中數據的一致性,數據的操...
    怪蜀黍Zzzzlw閱讀 437評論 0 0
  • 原文鏈接: java中數據庫事務嵌套與mysql事務隔離級別 今天在java代碼中遇到一個數據庫相關的bug,在分...
    rainybowe閱讀 2,919評論 2 11
  • 《陌生的女兒》初看書名,會以為是一個青春期的孩子與父母之間不斷碰撞,最終彼此獲得諒解的書??赐旰髤s覺別有洞天...
    夏筠若閱讀 2,163評論 0 1