关于.NET编程中各种事务的实现

来源:互联网 发布:易语言发送qq消息源码 编辑:程序博客网 时间:2024/05/29 17:00

从数据库事务开始

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

BEGIN TRANSACTION  UPDATE tb_Book SET Price=122 WHERE IDENT_CURRENT=1001UPDATE tb_Book SET Price=88 WHERE IDENT_CURRENT=1002IF @@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事务,内部实现及其复杂,本文主要简单说明事务的基本用法,针对原理性的研究请关注零度博客未来的文章,感谢您的阅读,希望对您有所帮助!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办 大脚趾指甲空了怎么办 脚趾甲长在肉里怎么办 脚趾甲又厚又硬怎么办 小孩子咳嗽有痰怎么办%3f 支气扩张咳血怎么办小 背部第8块脊椎疼怎么办 坐时间长了背疼怎么办 新生儿总哭怎么办吐奶 婴儿吃饱了还哭怎么办 宝宝喉咙哭哑了怎么办 婴儿哭哑了嗓子怎么办 婴儿胖子哭哑了怎么办 孩子声音哭哑了怎么办 喝咖啡手抖心慌怎么办 累了就心慌发抖怎么办 经常头晕心慌胸闷乏力怎么办 在末地迷路了怎么办 在森林里迷路了怎么办 电热宝充电不热怎么办 保温壶按钮坏了怎么办 热水壶盖子坏了怎么办 充电暖宝宝不热怎么办 刚怀孕孕酮低该怎么办 小三怀孕了该怎么办 15学生怀孕了该怎么办 学东西慢悟性差怎么办 欠债不还怎么办有欠条 欠了几百万我该怎么办