日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

在C#中实现SQLite的事务处理

發布時間:2024/3/7 C# 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在C#中实现SQLite的事务处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、SQLite事務介紹

事務是針對一個或多個數據庫中數據操作的基本單位,操作時可以把許多個SQLite語句組合為一組,把所有這些放在一起作為事務的一部分進行執行。

所有 SQL 命令組成一個單元。 要么全部保存,要么什么都不保存。 這是事務背后的基本思想。
事務控制指令只能和數據庫操作語言(DML命令INSERT、UPDATA、DELETE)結合使用。不能再創建表和刪除表時使用,因為這些操作在數據庫中是自動提交的。
事務包括4個屬性

  • 原子性
    確保工作單位內的所有操作都能完成,否則事務會在出現故障時終止,之前的操作也會回滾到以前的狀態。
  • 一致性
    指的是確保數據庫在成功提交事務上正確的改變狀態。
  • 隔離性
    事務和事務之間互不干涉、相互之間沒有影響。通過數據庫級上的獨占性和共享鎖來實現,讀取時允許多個進程或者線程,而進行寫數據時只能有一個進程或者線程。
  • 持久性
    確保已提交的事務的結果或效果在系統發生故障的情況下仍然存在。

SQLtie支持事務處理主要是通過事務標記、事務提交以及事務回滾來保證一個事務中所有操作都完成或者回滾到事務開始前的狀態。

SQL語句功能用法
BEGIN TRANSACTION標記一個事務起點BEGIN[TRANSACTION[name]]
END TRANSACTION標記一個事務終止END[TRANSACTION[name]]
ROLL BACK TRANSACTION回滾到事務起始點ROLL BACK[TRANSACTION[name]]
COMMIT TRANSACTION標記一個事務結束COMMIT[TRANSACTION[name]]

二、SQLite事務實戰

static void Main(string[] args){//連接了你選中的那個數據庫string connectionString = "E:\\SQLiteTRANSACTION\\SQLiteTRANSACTION\\bin\\Debug\\DatabaseTest.db";SQLiteConnection dbConnection = new SQLiteConnection();//***SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();connstr.DataSource = connectionString;dbConnection.ConnectionString = connstr.ToString();dbConnection.Open();//SQLiteTransaction tr = dbConnection.BeginTransaction();//事務開始try{ SQLiteCommand cmd = new SQLiteCommand();cmd.CommandText = "DROP TABLE IF EXISTS Company1";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "CREATE TABLE Company1(ID INTEGER PRIMARY KEY NOT NULL,NAME TEXT NOT NULL)";//創建一個表,ID為主鍵,NOT NULL 表示這個不能為空cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('ALBABA')";//表插入內容cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('HKWS')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('HUAW')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('GSYH')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery(); Console.Write("FINALLY");tr.Commit();//把事務調用的更改保存到數據庫中,事務結束dbConnection.Close();}catch(Exception ex){Console.Write(ex.Message);tr.Rollback();//回滾}}

三、事務的優點

事務除了帶來安全的數據操作之外,還提升了數據插入的效率。
此處案例參考了博客【如何高效使用SQLite事務 .net (C#】
1.在不使用事務的前提下,批量插入1000條數據,我測試時時間花費4分22.44576秒

using System.Data; using System.Data.Common; using System.Data.SQLite;// 創建數據庫文件 File.Delete("test1.db3"); SQLiteConnection.CreateFile("test1.db3");DbProviderFactory factory = SQLiteFactory.Instance; using (DbConnection conn = factory.CreateConnection()) {// 連接數據庫conn.ConnectionString = "Data Source=test1.db3";conn.Open();// 創建數據表string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";DbCommand cmd = conn.CreateCommand();cmd.Connection = conn;cmd.CommandText = sql;cmd.ExecuteNonQuery();// 添加參數cmd.Parameters.Add(cmd.CreateParameter());// 開始計時Stopwatch watch = new Stopwatch();watch.Start();// 連續插入1000條記錄for (int i = 0; i < 1000; i++){cmd.CommandText = "insert into [test1] ([s]) values (?)";cmd.Parameters[0].Value = i.ToString();cmd.ExecuteNonQuery();}// 停止計時watch.Stop();Console.WriteLine(watch.Elapsed); }

2.在使用事務批量插入1000條數據時,測試發現中共花費2秒

using System.Data; using System.Data.Common; using System.Data.SQLite;// 創建數據庫文件 File.Delete("test1.db3"); SQLiteConnection.CreateFile("test1.db3");DbProviderFactory factory = SQLiteFactory.Instance; using (DbConnection conn = factory.CreateConnection()) {// 連接數據庫conn.ConnectionString = "Data Source=test1.db3";conn.Open();// 創建數據表string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";DbCommand cmd = conn.CreateCommand();cmd.Connection = conn;cmd.CommandText = sql;cmd.ExecuteNonQuery();// 添加參數cmd.Parameters.Add(cmd.CreateParameter());// 開始計時Stopwatch watch = new Stopwatch();watch.Start();DbTransaction trans = conn.BeginTransaction(); // <-------------------try {// 連續插入1000條記錄for (int i = 0; i < 1000; i++){cmd.CommandText = "insert into [test1] ([s]) values (?)";cmd.Parameters[0].Value = i.ToString();cmd.ExecuteNonQuery();}trans.Commit(); // <-------------------}catch{trans.Rollback(); // <-------------------throw; // <-------------------}// 停止計時watch.Stop();Console.WriteLine(watch.Elapsed); }

兩者如此大的差距是因為SQLite 缺省為每個操作啟動一個事務,那么原代碼 1000 次插入起碼開啟了 1000 個事務,“事務開啟 + SQL 執行 + 事務關閉” 自然耗費了大量的時間,這也是后面顯示啟動事務后為什么如此快的原因。其實這是數據庫操作的基本常識,大家要緊記,不好的代碼效率差的不是一點半點。

總結

以上是生活随笔為你收集整理的在C#中实现SQLite的事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。