在C#中实现SQLite的事务处理
生活随笔
收集整理的這篇文章主要介紹了
在C#中实现SQLite的事务处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、SQLite事務介紹
事務是針對一個或多個數據庫中數據操作的基本單位,操作時可以把許多個SQLite語句組合為一組,把所有這些放在一起作為事務的一部分進行執行。
所有 SQL 命令組成一個單元。 要么全部保存,要么什么都不保存。 這是事務背后的基本思想。
事務控制指令只能和數據庫操作語言(DML命令INSERT、UPDATA、DELETE)結合使用。不能再創建表和刪除表時使用,因為這些操作在數據庫中是自動提交的。
事務包括4個屬性
- 原子性
確保工作單位內的所有操作都能完成,否則事務會在出現故障時終止,之前的操作也會回滾到以前的狀態。 - 一致性
指的是確保數據庫在成功提交事務上正確的改變狀態。 - 隔離性
事務和事務之間互不干涉、相互之間沒有影響。通過數據庫級上的獨占性和共享鎖來實現,讀取時允許多個進程或者線程,而進行寫數據時只能有一個進程或者線程。 - 持久性
確保已提交的事務的結果或效果在系統發生故障的情況下仍然存在。
SQLtie支持事務處理主要是通過事務標記、事務提交以及事務回滾來保證一個事務中所有操作都完成或者回滾到事務開始前的狀態。
| 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秒
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的事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建立自己的封装库(一)
- 下一篇: 互联网赚钱的项目有哪些?6个互联网赚钱模