从数据库事务开始

在很早的以前,我们要实现一个事务通常是基于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. cross validation笔记

    preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数 ...

  2. C++/Php/Python 语言执行shell命令

    编程中经常需要在程序中使用shell命令来简化程序,这里记录一下. 1. C++ 执行shell命令 #include <iostream> #include <string> ...

  3. Tensorflow 模型持久化saver及加载图结构

    主要内容: 1. 直接保存,加载模型; (可以指定加载,保存的var_list) 2. 加载,保存指定变量的模型 3. slim加载模型使用 4. 加载模型图结构和参数等 tensorflow 恢复部 ...

  4. 文本框只能输入数字(兼容IE火狐)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 五险一金 社保基数 住房公积金基数以及个税(By FlyElephant)

    作为最近转正的应届毕业生,查了一下卡发现卡上的钱和工资对不上,于是自己回来研究了一下五险一金,整理如下: 什么是五险一金? 五险一金其中主要指的是养老保险,医疗保险,失业保险,工伤保险,生育保险,一金 ...

  6. 异常捕获 崩溃 Bugly ACRC 简介 总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Ios开发之Category

    Category是在不改变已存在类的情况下,对其添加方法来达到对类进行功能扩展的目的. 对类功能进行拓展的时候,我们会有多种方式,比如说可以通过继承也可以进行功能扩展,但是在Category和继承上我 ...

  8. random_state 参数

    SVC(random_state=0)里有参数 random_state random_state 相当于随机数种子,下面会有代码来解释其作用.图中设置了 random.seed() 就相当于在 SV ...

  9. python3 AttributeError: module 'sklearn' has no attribute 'linear_model'

    以下导入方式报错 import sklearn lr = sklearn.linear_model.LinearRegression() # 需要导入sklearn的linear_model 修改导入 ...

  10. SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005

    New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differen ...