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

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

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

  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. Git 相关总结

    Git 优秀在线教程 廖雪峰-史上最浅显易懂的Git教程!

  2. Linux常用命令(一)

    Linux常用命令 1. pwd查看当前路径(Print Working Directory)    [root@CentOS ~]# pwd/root 2. cd .. 返回上一级 .. 表示上一级 ...

  3. 2016年6月份那些最实用的 jQuery 插件专辑

    jQuery 是一个快速.流行的 JavaScript 库,jQuery 用于文档处理.事件处理.动画和 Ajax 交互非常简单,学习曲线也很平坦.2016年6月的 jQuery 插件专辑里,我们选择 ...

  4. JS高程5.引用类型(1)Object类型

    引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...

  5. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  6. 【centos7】添加开机启动服务/脚本

    一.添加开机自启服务 在centos7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例): systemctl enable jenkins.service #设置jenkins服务为 ...

  7. linux定制

    http://cc.bingj.com/cache.aspx?q=OpenEmbedded+clfs&d=4706495287069596&mkt=zh-CN&setlang= ...

  8. React Native:使用 JavaScript 构建原生应用

    [转载] 本篇为联合翻译,译者:寸志,范洪春,kmokidd,姜天意 数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生 ...

  9. VMware中CPU分配不合理以及License限制引起的SQL Scheduler不能用于查询处理

    有一台SQL Server(SQL Server 2014 标准版)服务器中的scheduler_count与cpu_count不一致,如下截图所示: SELECT  cpu_count ,      ...

  10. ORACLE分区表梳理系列(一)- 分区表概述、分类、使用方法及注意事项

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...