Dapper事務——更好的數據庫管理

一、Dapper簡介

Dapper是一種使用最廣泛的.NET ORM,提供了基於語句和基於模型的方式來操作關係型數據庫。它的速度非常快,其代碼的可讀性和可維護性也被廣泛認可。Dapper通常用於小型項目,而對於大型項目,它也可作為輕量級 ORM 的選擇。

二、Dapper事務基礎

Dapper事務是一種控制多個操作的原子性和可靠性的技術。它可確保事務中的所有操作都將作為一個整體執行。如果事務中的任何一個操作出現故障,整個事務都會被回滾,並且所有對數據庫的更新都將被撤消。

一個基本的Dapper事務支持以下幾個核心方法:

using (var connection = new SqlConnection(connectionString))
{
    connection.Open(); 
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
           //執行操作
           transaction.Commit();
        }
        catch (Exception ex)
        {
           transaction.Rollback();
        }
    }
}

該代碼段展示了一個完整的事務操作。首先,使用SqlConnection類打開數據庫連接。然後,使用SqlTransaction類啟動一個事務。之後,在try代碼塊中執行所有操作。如果出現異常,將立即回滾事務,否則通過調用Commit()方法提交事務。

三、Dapper使用事務

對於Dapper事務,我們可以執行多個SQL語句並將它們組合到一個完整的操作中。事務中應該只包含與其它操作相關的語句,在這裡,我們可以使用Execute()函數來執行語句並返回受影響的行數。

using (var connection = new SqlConnection(connectionString))
{
    connection.Open(); 
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
           //SQL 語句 1 和 2
           //檢查影響的行數是否正確
           int affectedRows1 = connection.Execute(sql1,new {  },transaction);
           int affectedRows2 = connection.Execute(sql2,new {  },transaction);

           transaction.Commit();
        }
        catch (Exception ex)
        {
           transaction.Rollback();
        }
    }
}

在這個例子中,兩個SQL語句被包含在事務中。Execute()函數執行兩個語句,並通過檢查每個語句受影響的行數來檢查操作的真實意義。如果兩個語句都返回正確的行數,那麼事務就會被提交。如果出現異常,事務將回滾,不會對數據庫造成影響。

四、Dapper事務的嵌套

嵌套事務是對大型系統的管理非常重要的一種技術。在Dapper中,我們也可以使用嵌套事務,只要它們都使用同一個SqlConnection對象進行操作即可。

using (var connection = new SqlConnection(connectionString))
{
    connection.Open(); 
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
            //SQL 語句 1
            int affectedRows1 = connection.Execute(sql1,new {  },transaction);

            //INNER TRANSACTION
            using (var innerTransaction = connection.BeginTransaction())
            {
                try
                {
                    //SQL 語句 2
                    int affectedRows2 = connection.Execute(sql2,new {  },innerTransaction);

                    //INNER TRANSACTION COMMIT
                    innerTransaction.Commit();
                }
                catch (Exception ex)
                {
                    innerTransaction.Rollback();
                }
            }

            //SQL 語句 3
            int affectedRows3 = connection.Execute(sql3,new {  },transaction);

            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
        }
    }
}

在這個例子中,嵌套事務包括第二個SQL操作,它在自己的獨立事務中運行。如果內部事務出現問題,它將被回滾,並且外部事務也將被回滾。如果所有操作都執行正確,那麼事務就會被成功提交。

五、Dapper事務的性能考量

性能是Dapper事務的一個關鍵問題。在大型系統中,事務可能會變得非常大,這意味着操作的數量非常多。因此,它們需要快速並且可靠。

其中一種方法是將事務與批處理結合使用。批處理允許多行SQL語句與事務一起提交。這減少了數據庫請求的數量,從而提高了性能。Dapper可以使用批處理庫,將相同類型的語句組合到一起執行。

using (var connection = new SqlConnection(connectionString))
{
    connection.Open(); 
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
            //開始批處理
            SqlMapper.GridReader reader = connection.QueryMultiple(sql, new {  }, transaction, commandType: CommandType.Text);

            //執行SQL命令
            List affectedRows = new List();
            int currentAffectedRow = 0;

            do
            {
                var innerResult= reader.Read();
                if (innerResult != null)
                {
                    currentAffectedRow = innerResult.Sum();
                    affectedRows.Add(currentAffectedRow);
                }
            } while (currentAffectedRow > 0);

            //批處理完成
            transaction.Commit();
        }
        catch (Exception ex)
        {
            transaction.Rollback();
        }
    }
}

在這個例子中,我們對一個SQL語句進行了批處理,而且對SQL返回的結果分批處理。有一組命令會被發送到SqlServer,然後返回結果。我們必須使用GridReader來處理結果。截至最後,所有的操作都會進行提交,如果有問題出現,就會回滾整個操作。

六、總結

Dapper事務是一個非常強大的技術。它允許開發人員創建具有原子性和可靠性的事務,為數據庫操作提供了一個完整的解決方案。我們可以採用嵌套事務和批處理等方法來提高性能。使用這些技術,我們可以更好地控制數據庫的更新。

原創文章,作者:ZSVNH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/332329.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZSVNH的頭像ZSVNH
上一篇 2025-01-21 17:30
下一篇 2025-01-21 17:30

相關推薦

  • Java Hmily分布式事務解決方案

    分布式系統是現在互聯網公司架構中的必備項,但隨着業務的不斷擴展,分布式事務的問題也日益凸顯。為了解決分布式事務問題,Java Hmily分布式事務解決方案應運而生。本文將對Java…

    編程 2025-04-28
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • MariaDB XA事務的使用方法

    本文將從多個方面對MariaDB XA事務進行詳細的闡述,包括XA事務的定義、特點、使用方法以及示例代碼等。通過本文的閱讀,讀者將能夠更好地理解和應用MariaDB XA事務。 一…

    編程 2025-04-27
  • 深入了解SQLite事務

    SQLite是一個輕量級的數據庫引擎,適用於嵌入式設備和移動設備,它是一個支持SQL標準的、完全獨立的、自給自足的服務器less SQL數據庫引擎。事務是數據庫中最基本的概念之一,…

    編程 2025-04-24
  • Spring 事務傳播詳解

    一、事務概念 事務是一組由一個或多個操作組成的不可分割的工作單元,這些操作要麼全部成功,要麼全部失敗。在關係型數據庫中,事務是指一組SQL語句組成的操作序列,具有四個特性:原子性、…

    編程 2025-04-24
  • 深入了解RocketMQ事務消息

    一、什麼是RocketMQ事務消息 RocketMQ事務消息是指在消息發送方發送消息時,延遲將消息狀態提交給broker,由broker進行二次確認,以確保消息不會因發送失敗而丟失…

    編程 2025-04-24
  • 深入淺出Spring事務傳播機制

    一、事務概念 事務是指作為單個邏輯工作單元執行的一系列操作,所有操作要麼全部成功完成,要麼全部失敗而回滾。在關係型數據庫中,事務通常是指一系列的數據操作,比如增刪改查等。 二、Sp…

    編程 2025-04-18
  • Java分布式事務解決方案詳解

    一、概述 隨着互聯網的發展,分布式系統越來越成為一種常見的系統架構。在分布式系統中,數據、計算和控制被分布在多個節點上。這種分布式架構帶來了靈活性和高可用性,但是也帶來了一些挑戰,…

    編程 2025-04-12
  • 阿里分布式事務詳解

    一、概述 阿里分布式事務(Ali Distributed Transaction)是阿里巴巴集團開發的一套分布式事務解決方案。它提供了一種可靠的、高性能、易擴展的分布式事務處理機制…

    編程 2025-02-25
  • 多線程事務控制

    一、基本概念 事務是指作為單一邏輯工作單元執行的一系列操作。多線程事務控制就是在多線程並發環境下對事務進行管理和控制,保證事務的原子性、一致性、隔離性和持久性。 原子性是指事務中的…

    編程 2025-02-24

發表回復

登錄後才能評論