当前位置: 首页 > news >正文

【C#】简单聊下Framework框架下的事务

框架用的多了,之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务

目录

  • 1、SqlClient
  • 2、TransactionScope
  • 3、引用

1、SqlClient

在 C# 中,使用 using 块可以方便地实现对资源的自动释放,但它不适用于实现事务处理。为了在 C# 中实现事务,在关系型数据库中,你可以使用 ADO.NET 类库中的事务机制。

例如,如果你正在使用 SQL Server 数据库,可以使用 SqlTransaction 类来执行事务操作。以下是一个示例,演示如何在 C# 中使用 SqlTransaction 类来执行事务:

using System.Data.SqlClient;public class Program
{public static void Main(){string connectionString = "your_connection_string";using (SqlConnection connection = new SqlConnection(connectionString)){connection.Open();// 开始事务SqlTransaction transaction = connection.BeginTransaction();try{// 执行数据库操作using (SqlCommand command = connection.CreateCommand()){command.Transaction = transaction;command.CommandText = "INSERT INTO YourTable (Column1, Column2) VALUES (@Value1, @Value2)";command.Parameters.AddWithValue("@Value1", "Value 1");command.Parameters.AddWithValue("@Value2", "Value 2");command.ExecuteNonQuery();}// 提交事务transaction.Commit();}catch (Exception ex){// 回滚事务transaction.Rollback();Console.WriteLine("Transaction failed: " + ex.Message);}}}
}

在上面的示例中,我们使用 SqlConnection 来创建一个数据库连接,并通过 BeginTransaction 方法创建一个事务。然后,我们可以在事务中执行数据库操作,如果操作成功,可以调用 Commit 方法提交事务;如果操作发生异常,可以调用 Rollback 方法回滚事务。

请注意,上述示例仅用于演示事务处理的基本概念,实际数据库和操作的情况可能有所不同。你需要根据自己的数据库类型和操作进行相应的调整。

2、TransactionScope

在 C# 中,在操作数据库时,使用 using 语句块来创建事务是不可行的,因为 using 语句块会自动处理资源的释放,而事务需要在事务完成之前持续存在。

为了实现独立的事务作用域,你可以使用 TransactionScope 类来管理事务。TransactionScope 类提供了一种简单的方式来处理事务,它在代码块内自动处理事务的提交或回滚,做到了事务的嵌套和分布式事务的支持。

以下是一个示例,演示如何在 C# 中使用 TransactionScope 来实现独立的事务处理:

using System;
using System.Data.SqlClient;
using System.Transactions;public class Program
{public static void Main(){string connectionString = "your_connection_string";using (TransactionScope scope = new TransactionScope()){try{using (SqlConnection connection1 = new SqlConnection(connectionString)){connection1.Open();// 在第一个连接上执行数据库操作using (SqlCommand command1 = connection1.CreateCommand()){command1.CommandText = "INSERT INTO Table1 (Column1, Column2) VALUES (@Value1, @Value2)";command1.Parameters.AddWithValue("@Value1", "Value 1");command1.Parameters.AddWithValue("@Value2", "Value 2");command1.ExecuteNonQuery();}}using (SqlConnection connection2 = new SqlConnection(connectionString)){connection2.Open();// 在第二个连接上执行数据库操作using (SqlCommand command2 = connection2.CreateCommand()){command2.CommandText = "INSERT INTO Table2 (Column1, Column2) VALUES (@Value1, @Value2)";command2.Parameters.AddWithValue("@Value1", "Value 1");command2.Parameters.AddWithValue("@Value2", "Value 2");command2.ExecuteNonQuery();}}// 提交事务scope.Complete();}catch (Exception ex){// 回滚事务Console.WriteLine("Transaction failed: " + ex.Message);}}}
}

在上面的示例中,我们使用 TransactionScope 类创建了一个独立的事务作用域。在事务作用域内部,我们可以在多个连接上执行数据库操作,当所有操作都成功完成时,调用 Complete 方法来提交整个事务;如果任何操作失败,则事务会自动回滚。

请注意,为了使用 TransactionScope 类,你需要在代码文件的顶部添加对 System.Transactions 命名空间的引用,并确保所使用的数据库驱动程序和数据库支持 System.Transactions 命名空间。此外,将 TransactionScope 与分布式事务一起使用时,还需要配置相关的分布式事务管理器。

3、引用

在 .NET Framework 4.8 中,System.Transactions 命名空间是可用的,并且不需要通过 NuGet 包进行下载和安装。它是 .NET Framework 的一部分,以支持事务处理。

如果你在 .NET Framework 4.8 的项目中无法使用 System.Transactions,请确保你的项目引用了正确的 .NET Framework 版本。你可以在 Visual Studio 中检查项目属性,确认项目的目标框架版本为 .NET Framework 4.8。

如果你的项目已经正确引用了 .NET Framework 4.8,并且仍然无法使用 System.Transactions,可能有以下几种可能的原因:

1)缺少对 System.Transactions 的引用:请确保你的代码文件中包含了 using System.Transactions; 的引用语句。

2)其他命名冲突:如果你有其他命名空间或类型与 System.Transactions 冲突,可能会导致无法使用它。请检查你的代码,并确保没有命名冲突的情况发生。

3)缺少相关的程序集:确保你的项目引用了 System.Transactions 相关的程序集。在添加引用时,可以在 “引用” 文件夹中查找并添加名为 “System.Transactions” 的程序集。
在这里插入图片描述

http://www.lryc.cn/news/94170.html

相关文章:

  • asyncPool并发执行请求函数
  • Ubuntu 22.04上安装NFS服务
  • 数据结构--双链表
  • javassist 动态修改 jar 包中 class
  • 什么是CC攻击?
  • ​LeetCode解法汇总253. 重构 2 行二进制矩阵
  • ChatGPT实战:生成演讲稿
  • 在线搭建K8S,kubernetes集群v1.23.9,docker支持的最后一个版本
  • http自动跳转https的配置方法
  • 重新初始化k8s集群
  • JetBrains编程IDE将具备Ai助手功能,或将提高开发速度
  • 【网络原理】TCP/IP协议五层模型
  • 【备战秋招】每日一题:2023.05.10-华为OD机试(第二题)-解密
  • 【华为OD机试】矩阵最大值(python, java, c++, js)
  • 通过USB和wifi连接真机编写第一个脚本
  • 【javascript】 javascript对象函数 总结
  • LVS+Keepalived 高可用群集实战部署
  • MCU启动过程
  • Mysql 5.6使用配置文件my.ini来设置长时间连接数据库
  • 改进YOLOv5/YOLOv8:复现结合即插即用 | 高效多尺度注意力(EMA),模块成为YOLOv5改进的小帮手
  • 图像色彩增强论文调研
  • ORACLE透明网关ODBC连接MYSQL
  • Flutter网络请求框架Dio源码分析以及封装(二)--Cookie管理分析
  • Unity如何设计一个技能系统
  • 测试流程体系
  • Linux下CentOS KVM 虚拟化
  • < vue + ElementUi 组件封装:实现弹窗展示富文本数据,允许全文搜索高亮显示搜索内容 >
  • MATLAB 之 低层绘图操作和光照及材质处理
  • LLM-Client一个轻量级的LLM集成工具
  • leetcode动态数组vector实现杨辉三角