在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的事务处理相关推荐
- Swift 中使用 SQLite——批量更新(事务处理)
本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新. 事务 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态 开始数据操作 如果数据操作成功,提交事 ...
- android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用
数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...
- Swift 中使用 SQLite——打开数据库
关于Swift中使用SQLite,接下来可能会分别从打开.增.删.改.查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开. 定义全局数据库访问句柄 /// 全局数据库访问句柄 pri ...
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用
part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...
- sqlite学习笔记7:C语言中使用sqlite之打开数据库
数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...
- python用sqlite数据库,python 中使用sqlite数据库
sqlite3是使用文件作为数据库,它属于轻量级数据库,支持在多平台下使用. SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守A ...
- Android中实现SQLite数据库CRUD操作的两种方式
Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...
- cocos2d-x 3.0rc2中读取sqlite文件
cocos2d-x 3.0rc2中读取sqlite文件的方式,在Android中直接读取软件内的会失败.须要复制到可写的路径下 sqlite3* dbFile = NULL;std::string p ...
- 在C#中使用SQLite
SQLite 是一个嵌入式的关系数据库系统,使用十分广泛.在一些数据量不大的应用程序中,如果使用SQLite可以极大的减少部署时的工作量. 要在C#中使用SQLite也很简单,只要找一个C#的wrap ...
最新文章
- [译] 响应式 Web 应用(一)
- 软件工程-第一次作业
- autumn 0.5.1 : Python Package Index
- cudnn下载_Windows10安装 cuDNN 方法
- 计算平均指令时间_为什么向量化计算(vectorization)会这么快?
- 摊牌了,我靠它们成功实现了AI零基础入门到进阶!
- 如何开始使用Java中的Lambda表达式
- 物联网技术或颠覆传统高等教育
- MySQL高级知识(一)——基础
- 使用VS2012遇到的问题
- 学习笔记---将Asp.Net网站发布到IIS的四种方法及注意事项
- 智能客户—ERP技术新方向
- mysql基础之视图、事务、索引、外键
- html5设置视频背景颜色,HTML5设置视频背景的方法介绍
- Blend for Visual Studio
- 微信小程序如何解析标签?
- excel表格拆分多个表如何操作
- Linux之IFS间隔符、C编程、gdb调试
- 小米WatchS2和小米WatchS1 区别 哪个值得入手
- sql server数据库卡问题排查
热门文章
- USACO 2017 December Contest Platinum T3: Greedy Gift Takers
- source insight 4.0 选择后,相同单词全部高亮
- 米波现场桌面软件服务器地址,米波现场系统启动workerman服务service workerman start...
- 【转】山地车知识:什么是XC,什么又是Freeride
- python代码实现时间从12小时制到24小时制的转换
- 运用CS-LBP提取裂纹的梯度特征
- 计算机主机无法开机故障原因,惠普电脑开不了机怎么办 惠普电脑开不了机是什么原因 惠普电脑开机常见问题...
- GCP/临床试验基础知识集锦
- docker 镜像启动并完成服务部署
- WPF 使用思源字体