C#事务
看了很多关于事务的概念,还是觉得维基百科上说的最好:
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰
从以上可以看出,事务主要的作用有两个:失败回滚和并发访问。事务处理技术主要包括数据库恢复技术和并发控制技术。
- 在sql中
事务的开始和结束可以有用户显示定义,若用户未定义,则由DBMS按缺省规定自动划分事务。在批量修改数据库时,建议显示定义事务,这样发生错误可以将恢复至未修改之前的状态。
SQL定义事务的语句:
-BEGIN TRANSACTION 事务开始
-COMMIT 提交事务,即将事务中所有对数据库的操作更新至磁盘的物理数据库中
-ROLLBACK 事务回滚,事务运行中发生故障,需要撤销已完成的所有操作,回到原始状态
**事务的四特性,简称ACID:
-原子性和一致性:事务操作要么都做,要么都不做;结果要么都成功。
-隔离性:一个事务的执行不可以被其他事务干扰。
-持续性:也称永久性,即事务一旦提交,对数据库的改变就是永久的。
事务ACID可能遭受破坏的因素:
-多个事务并行运行,不同事务的操作交叉执行;
-事务在运行过程中被强行停止。
这些就是恢复机制和并发控制机制的责任。
- 使用OdbcTransaction(OleDbTransaction、SqlTransaction、DbTransaction...)
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open(); OdbcCommand command = connection.CreateCommand(); //启动事务
OdbcTransaction transaction = connection.BeginTransaction(); //设定事务和连接对象
command.Connection = connection;
command.Transaction = transaction; try
{
command.CommandText = "Insert into ...";
command.ExecuteNonQuery(); // 完成提交
transaction.Commit();
}
catch (Exception ex)
{
//数据回滚
transaction.Rollback();
}
}
在建立事务的时候,可以设置事务的锁定级别:(MSDN事务锁定参考)
OdbcTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);//IsolationLevel指定连接的锁定行为
所有级别(事务并发控制详细说明请参照《数据库系统概论》并发控制-章节),以下为整理的说明:
Chaos-对于更高隔离级别事务中未进行的修改,不可以重写。
ReadCommitted-提交读。共享锁可以避免脏读,但在事务结束之前如果数据被修改的话,会导致不可重复读或幻影数据。由于不是范围锁,单次查询结束后就被释放,这时如果记录被修改,则可能造成不可重复读;若插入新记录,则可能造成幻影读;
ReadUncommitted-未提交读。未提交读(READ UNCOMMITTED)是最低的隔离级别。允许脏读(dirty reads),事务可以看到其他事务“尚未提交”的修改。通过比低一级的隔离级别要求更多的限制,高一级的级别提供更强的隔离性。标准允许事务运行在更强的事务隔离级别上。(如在可重复读(REPEATABLE READS)隔离级别上执行提交读(READ COMMITTED)的事务是没有问题的)
RepeatableRead-可重复读。在可重复读(REPEATABLE READS)隔离级别中,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁(range-locks)”,因此可能会发生“幻影读(phantom reads)”。
Serializable-可串行化(可序列化)。最高的隔离级别。直接对数据库进行加锁,阻止其他用户更新或插入数据,直到事务提交;
Snapshot-通过存储数据副本,达到数据读取不受其他修改影响的效果,减少阻塞。即使重新查询,另一事务所做的修改也不会对现在的事务造成影响。
Unspecified-正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。
下面是dll中的解释:
| Unspecified | 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 |
| Chaos | 无法覆盖隔离级别更高的事务中的挂起的更改。 |
| ReadUncommitted | 可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。 |
| ReadCommitted | 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 |
| RepeatableRead | 在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。防止不可重复的读取,但是仍可以有幻像行。 |
| Serializable | 在 System.Data.DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。 |
| Snapshot | 通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。 |


- 使用TransactionScope
using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required))
{
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open(); OdbcCommand command = connection.CreateCommand();
command.Connection = connection; command.CommandText = "Insert into ...";
command.ExecuteNonQuery();
//... //若前面发生错误而为执行Complete,事务将自动回滚
scope.Complete();
}
}
C#事务的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- 事务日志已满,原因为“ACTIVE_TRANSACTION”
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列 http://www.cnblogs.com/dunitia ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- Mysql事务探索及其在Django中的实践(一)
前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- PHP中PDO事务的使用方法
事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
随机推荐
- About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...
- css单行文本与多行溢出文本的省略号问题
在文字布局和代码编写过程中遇到文本溢出是常有的事,下面总结一下对于单行文本溢出和多行文本溢出省略号的处理. 一.单行文本省略号 <p class="text1"> 这是 ...
- 提示用户升级浏览器代码 低于ie9的浏览器提示
一般想做一些酷炫的网站都有个烦恼,那就是兼容ie浏览器,好在现在使用ie的也越来越少,微软也转战edge浏览器. 使用 Bootstrap经常用js插件可以模拟兼容旧版本的浏览器(bsie 鄙视IE) ...
- Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理
RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...
- 了解npm的文件结构(npm-folders)和配置文件(npm-mrc)
一.npm的文件结构 npm的安装: 本地安装 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm ...
- 简历生成平台项目开发-STEP5初步界面demo实现
谭卓因为暑期实习,去杭州实习了,走之前在git上上传了一些文档(https://github.com/USTC-CV-creator/),项目到目前为止,前端demo已经做好,后台接收请求生成PDF部 ...
- 使用beautifulsoup与requests爬取数据
1.安装需要的库 bs4 beautifulSoup requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...
- apache 开机自启动脚本设置
默认我们源码编译安装apache,是不能使用service这个命令来启动的,通常我们启动的命令是: [root@localhost httpd-2.2.16]# /usr/local/apache2/ ...
- 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- [转]How do you create a custom AuthorizeAttribute in ASP.NET Core?
问: I'm trying to make a custom authorization attribute in ASP.NET Core. In previous versions it was ...