从数据库事务开始

在很早的以前,我们要实现一个事务通常是基于SQL的数据库事务,一般的通过SQL查询语言来实现,如下所示,同时更新两本书的价格:

BEGIN TRANSACTION
UPDATE tb_Book SET Price=122 WHERE IDENT_CURRENT=1001
UPDATE tb_Book SET Price=88 WHERE IDENT_CURRENT=1002
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
END
ELSE
COMMIT TRANSACTION

ADO.NET事务和分布式事务

随着.NET技术的不断发展,可通过ADO.NET来实现,这样我们可以将事务更好的应用在业务逻辑中,而非数据库存储中,这样能够更好的实现业务和存储分离,使的事务被业务逻辑所控制,数据库专注于数据存储,达到各负其责的作用,在ADO.NET中事务的写法是:

using (DbTransaction transaction = connection.BeginTransaction())
{
command.Transaction = transaction;
try
{
command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
throw;
}
}

上面的代码只能基于同一个数据库连接进行,后来为了实现远程多个数据库的事务,提出了分布式事务,夸数据库服务器进行事务关联:

using (TransactionScope transactionScope = new TransactionScope())
{
//操作数据库服务器1中的数据库
using (SqlConnection connection = new SqlConnection(connectionString1))
{
SqlCommand command = new SqlCommand(commandText1, connection);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
} //操作数据库服务器2中的数据库
using (SqlConnection connection = new SqlConnection(connectionString2))
{
SqlCommand command = new SqlCommand(commandText2, connection);
connection.Open();
command.ExecuteNonQuery();
connection.Close();
} transactionScope.Complete();
}

基于文件系统的事务(TXF)

有时候,我们需要将NTFS文件系统的操作进行事务管理,例如:首先将图片保存到硬盘,然后将文件路径存入数据库,这两个步骤是满足事务(ACID)原则的,数据库应该与文件系统保持同步,要么都删除,要么都存在,同生共死。但可惜微软没有在.NET中提供这样的API接口供开发人员使用,零度博主抱着对技术精益求精的态度进行了一番的折腾,终于在国外的一个社区找到了针对操作系统内核(kernel32.dll)封装的KTM事务管理方案,零度博主针对自己的需求进行了改进,本方案的C#.NET调用方式如下:

using (TransactionScope transactionScope = new TransactionScope())
{
string commandText = "UPDATE Book SET Price=88.50 WHERE ID=1001"; var fileStream = TransactedFile.Open(@"log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
StreamWriter streamWrite = new StreamWriter(fileStream);
streamWrite.WriteLine(string.Concat(DateTime.Now, commandText));
streamWrite.Flush();
streamWrite.Close(); SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(commandText, connection);
connection.Open();
command.ExecuteNonQuery();
connection.Close(); transactionScope.Complete();
}

以上示例代码首先创建TransactionScope事务环境,将文件操作和数据库操作关联成成同一个事务,TransactedFile正是上文提到的基于KTM的本地事务封装,数据库事务本身支持隐式自动关联,当前者和后者同时被关联到TransactionScope事务上下文环境后,就形成了一个完成的事务。上面的示例首先向磁盘的log.txt中写入当前的时间和要执行的SQL语句,然后通过SQL更新Book价格,如果更新价格失败则回滚写入的日志(自动删除日志)。

总之:事务是一个复杂的系统,主要有KTM、DTC和LTM事务,内部实现及其复杂,本文主要简单说明事务的基本用法,针对原理性的研究请关注零度博客未来的文章,感谢您的阅读,希望对您有所帮助!

关于.NET编程中各种事务的实现的更多相关文章

  1. 事务的概念,以及事务在JDBC编程中处理事务的步骤

    事务是作为单个逻辑工作单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为原子性.一致性.隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务 .JDBC处理事务有如下操作: 1,con ...

  2. sql编程篇 (五) 事务

    计算机中的事务 编辑 概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用 ...

  3. Java实战之03Spring-05Spring中的事务控制(基于AOP)

    五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1. ...

  4. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  5. 第77节:Java中的事务和数据库连接池和DBUtiles

    第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...

  6. (转)深入sql server中的事务

    原文地址:http://www.cnblogs.com/chnking/archive/2007/05/27/761209.html 参考文章:http://www.cnblogs.com/zhuif ...

  7. (转)Attribute在.net编程中的应用

    Attribute在.net编程中的应用(一)Attribute的基本概念 经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行.实际上在.Net中,Attribute是一 ...

  8. 编程中的幂等性 — HTTP幂等性

    幂等(idempotent.idempotence)是一个数学与计算机学概念,常见于抽象代数中. 在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.幂等函数,或幂等方法, ...

  9. Java中的事务——全局事务与本地事务

    转载,原文来源 http://www.hollischuang.com Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务.这是从事务的实现角度区 ...

随机推荐

  1. c#中的 数组

    数组即是一组相同类型组合在一起,使用一个通用的名称,通过分配的下标访问的数据集合中的元素. 数组是具有相同类型的一组数据.当访问数组中的数据时,可以通过下标来指明.c#中数组元素可以为任何数据类型,数 ...

  2. Exchange 2013与 Office Web Apps 整合

    好久没写什么新文章了,这里有关Office Web Apps 的部署我就省略了,只是在创建web场我一般 会创建2个url, 如: New-OfficeWebAppsFarm -InternalUrl ...

  3. 为什么static数据成员一定要在类外初始化?(转)

    1.避免重复定义和初始化 <<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法. 但,为什么static const int就可以在类 ...

  4. 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

    http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...

  5. AI-终极算法-神经网络(连结学派)

  6. ionic_ Network connectivity error occurred, are you offline?

    错误如下: HenHouse admin$ ionic cordova build ios --prod > ionic integrations enable cordova ✖ Downlo ...

  7. 转: linux进程地址图解

    http://www.cnblogs.com/clover-toeic/p/3754433.html

  8. VS2013开发一个简单的asmx接口程序

    一.开发和调试 1:创建一个ASP.NET web应用程序 2:选择空的模板 3:系统生成项目目录 4:右键项目-添加项-新建项 5:选择Web  服务(ASMX) 6:选择之后项目中会有一个Test ...

  9. ASP入门(十五)- Global.asa

    Global.asa 文件是一个可选文件,它可包含被 ASP 应用程序中每个页面访问的对象.变量和方法的声明.所有合法的浏览器脚本都可以在 Global.asa 中使用. Global.asa 文件只 ...

  10. .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator

    本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...