看了很多关于事务的概念,还是觉得维基百科上说的最好:

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰

从以上可以看出,事务主要的作用有两个:失败回滚并发访问。事务处理技术主要包括数据库恢复技术和并发控制技术。

  • 在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#事务的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  3. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

  10. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

随机推荐

  1. Ext JS 如何动态加载JavaScript创建窗体

    JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活.我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互.下面结合Ext JS ...

  2. 内网渗透-代理(reGeorg)

    我对于reGeorg的使用,只是简单说下. 首先需要下载reGeorg,下载地址:https://github.com/sensepost/reGeorg 然后将reGeorg,上传到服务端.直接访问 ...

  3. dagger2记录篇

    作为一个码农,什么都不用多讲,贴代码 build project build module Application public class App extends Application { pri ...

  4. 小程序https Android 安卓可以发request请求,IOS 苹果 发请求失败问题

    如果一个机器可以发送成功,一个机器发送失败,那多半是是域名的https支持的问题 那就用腾讯云的这个ssl测试工具检测下 https://www.qcloud.com/product/ssl#user ...

  5. iOS提交AppStore后申请加急审核

    提交审核后进去下面链接申请加急审核链接:https://developer.apple.com/appstore/contact/appreviewteam/index.html 在I would l ...

  6. 设置这些之后,Google突然可以打开了

    打开的是:https://www.google.com.hk

  7. 整理分享原生态mac AndroidStudio的快捷键

    使用AndroidStudio开发半年了,一路爬坑至今,刚由Windows转mac一个星期.通过查些资料和自己摸索,记录一些常用的快捷键,犹豫个人不喜欢改快捷键,所以都是原生的.特此分享给大家!欢迎补 ...

  8. Junit单元测试

    写一个被测试的类 这是类中的一些方法,将一个16进制转化为10进制 reckon()为转化的主要方法,返回结果为10进制数 judge()判断字符是否在0-9,A-F之间,并将字符转化为0-15之中的 ...

  9. 简历生成平台项目开发-STEP2问卷调查结果统计分析

    根据之前设计的调查问卷,截止目前为止,一共收到64份问卷结果.一共16题,分别从基本信息.是否对简历制作有需要.对产品期望的特点和建议采纳四个方面设计问题.下面逐题分析问卷结果: 1.您的性别 可以看 ...

  10. JAVA编程思想(第四版)学习笔记----11.5 List,11.6迭代器

    Collection类的层次结构图(来源与网络)如下所示: 接口:Iterator<T> public interface Iterable<T> Iterable<T& ...