【C#】简单认识TransactionScope,以及常见的事务类型

这篇具有很好参考价值的文章主要介绍了【C#】简单认识TransactionScope,以及常见的事务类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在实际项目开发时,后端编码少不了事务处理。
为什么要用事务,其中一个最直接的原因就是保持数据完整性和一致性

1、C#事务概念

1.1、逻辑单元

1)在C#中,事务是一组操作的逻辑单元,这些操作可以在一个单独的批处理中执行。
2)使用事务可以确保在操作期间的任何时候发生故障时,所有事务中的操作都将回滚(撤销),从而保持数据的一致性和完整性。
3)使用事务还可以确保在并发访问时,对数据的访问是原子性的,即事务中所有操作要么全部成功,要么全部失败。

1.2、Transaction对象

在C#中,可以使用ADO.NET中的事务来实现事务处理。可以通过定义一个Transaction对象,将多个操作包含在一个事务中。在事务中,执行的每个操作都需要使用Transaction对象的方法来指定操作的范围,这样当事务提交或者回滚时,所有操作都会被同时提交或者回滚。
它支持跨库事务。

1.3、事务简单实例

1)创建表

create table myTable(
	name nvarchar(50), 
	email nvarchar(50)
)

2)事务测试

using System.Data.SqlClient;

// 链接数据库
SqlConnection connection = new SqlConnection("Data Source=服务器IP.com;Initial Catalog=数据库名;User ID=账号;Password=密码");
connection.Open();

// 开始事务
SqlTransaction transaction = connection.BeginTransaction();

try
{
    // 执行数据库操作,并将它们添加到事务中
    SqlCommand command1 = new SqlCommand("INSERT INTO myTable (name, email) VALUES ('张三', 'zhangsan@test.com')", connection, transaction);
    SqlCommand command2 = new SqlCommand("UPDATE myTable SET email = 'zhang.san@test.com' WHERE name = '张三'", connection, transaction);
    command1.ExecuteNonQuery();
    command2.ExecuteNonQuery();

    // 事务提交
    transaction.Commit();
}
catch (Exception ex)
{
    // 发生异常,事务回滚
    transaction.Rollback();
}
finally
{
    // 关闭数据库链接
    connection.Close();
}

2、事务场景描述

假设有这样一个场景,在一个请求的接口方法里,进行A表添加操作,同时进行B表更新操作。
可以直观想象下,在没有使用事务情况下,A表添加操作成功了,B表更新失败,这个时候A表和B表就不能保持完整和一致,A表就会多了一条冗余数据。

1)创建表

create table table1 (
	id int, 
	name nvarchar(50)
)

create table table2 (
	id int, 
	name nvarchar(50)
)

1)事务代码

using (var scope = new TransactionScope())
{
    // 在Database1中执行事务操作
    using (var db1 = new SqlConnection("connection_string_1"))
    {
        db1.Open();
        using (var transaction = db1.BeginTransaction())
        {
            // 执行SQL命令
            var command1 = new SqlCommand("INSERT INTO table1 (id, name) VALUES (1, 'test')", db1, transaction);
            command1.ExecuteNonQuery();

            transaction.Commit();
        }
    }

    // 在Database2中执行事务操作
    using (var db2 = new SqlConnection("connection_string_2"))
    {
        db2.Open();
        using (var transaction = db2.BeginTransaction())
        {
            // 执行SQL命令
            var command2 = new SqlCommand("INSERT INTO table2 (id, name) VALUES (2, 'test')", db2, transaction);
            command2.ExecuteNonQuery();

            transaction.Commit();
        }
    }

    // 提交分布式事务
    scope.Complete();
}

3、事务流程图

3.1、没有事务流程

1)页面发起API请求
2)API执行内容逻辑代码
3)执行A表添加,不成功则响应信息回页面
4)A表添加成功,则继续执行下一步代码逻辑
5)执行B表更新,不成功则响应信息回页面
此时,A表记录添加成功,B表更新失败,数据则无法完整和一致
6)B表更新成功,则响应成功信息回页面
7)如果不是重要业务流程,影响不大
8)如果是支付流程,则影响就非常大了
假如支付成功,用户已经付款了,但是支付状态还是未支付状态,这个业务影响就大了
【C#】简单认识TransactionScope,以及常见的事务类型

3.2、有事务流程

1)页面发起API请求
2)API执行内容逻辑代码
3)执行A表添加,不成功则响应信息回页面,回滚事务
4)A表添加成功,则继续执行下一步代码逻辑
5)执行B表更新,不成功则响应信息回页面,回滚事务
此时,事务已经回滚,A表记录添加成功则撤销,A和B表操作,要么都成功,要么都失败
6)B表更新成功,则响应成功信息回页面
此时A和B都执行成功,就可以提交事务,完成两次成功操作
【C#】简单认识TransactionScope,以及常见的事务类型

4、常见事务类型

以下列举C#中常见的事务类型,对于其他开发语言应该也差不多

编号 事务类型 描述
1 本地事务 本地事务是一个在单个数据库上运行的事务。该事务的提交或回滚仅对该数据库有效。
2 分布式事务 分布式事务是一个跨多个数据库或系统的事务。该事务涉及多个资源管理器,例如数据库、消息队列或应用服务器。分布式事务可以是两阶段提交(2PC)或三阶段提交(3PC)。
3 隐式事务 隐式事务是自动管理的事务,由某些API或框架创建和控制。这些事务的创建和提交通常是透明的,并且不需要明确的代码编写。
4 显式事务 显式事务是由应用程序开发人员明确创建和控制的事务。显式事务需要显式的开启、提交或回滚操作。
5 悲观事务 悲观事务认为在任何时间点都会有竞争条件发生。因此,它锁定整个资源并在整个操作期间保持锁定状态。这可以确保只有一个事务可以修改资源。
6 乐观事务 乐观事务认为在大多数情况下,竞争条件不会发生。因此,它不锁定资源,并且只在提交时检查是否存在竞争条件。如果检测到竞争条件,则事务将回滚。

这些是一些常见的C#事务类型。开发小伙伴应确保选择适当的事务类型以确保数据的一致性和完整性。文章来源地址https://www.toymoban.com/news/detail-498439.html

到了这里,关于【C#】简单认识TransactionScope,以及常见的事务类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 异常处理机制和常见的异常类型

    在 C# 中,异常处理是一个非常重要的概念,它可以让我们在程序发生错误时进行有效的处理,使程序具备更好的鲁棒性。C# 异常处理机制基于 try-catch-finally 语句块,其基本用法如下: 在上面的代码中,try 块中的代码可能会抛出一些异常,如果发生异常,则会进入到相应的

    2023年04月21日
    浏览(31)
  • 认识http的方法、Header、状态码以及简单实现一个http的业务逻辑

    方法 说明 支持的HTTP版本 GET 获取资源 1.0/1.1 POST 传输实体主体 1.0/1.1 PUT 传输文件 1.0/1.1 HEAD 获得报文首部 1.0/1.1 DELETE 删除文件 1.0/1.1 OPTIONS 询问支持方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道协议连接代理 1.1 LINK 建立和资源之间的联系 1.0 UNLINE 断开连接关系 1.0 其中最为常见

    2024年02月13日
    浏览(35)
  • 【数据类型】C#和Sql Server、Mysql、Oracle等常见数据库的数据类型对应关系

    🏆🏆这是小5写的第二篇城市领跑者文章,一起为所在城市领跑助力吧! 🏆🏆在实际项目中,不管是用C#后端编程语言也好,还是Java后端编程语言,都可能会用到不同端的数据类型转换和对应关系 在 C# 和 SQL Server 之间,以下是一些最常用的数据类型对应关系: 编号 C#数据

    2024年02月11日
    浏览(56)
  • Django学习记录:初步认识django以及实现了简单的网页登录页面的前后端开发

    1、可以先删去template文件夹,并在setting里面删掉这一行 2、在pycharm中创建app: 3、启动app:编写URL与视图函数关系【urls.py】 ​ 编写视图函数【views.py】 ​ 启动pycharm项目 4、引用静态文件 其中有两个文件的导入:(jquery和bootstrap) jquery:https://code.jquery.com/jquery-3.6.0.min.js 可

    2024年02月14日
    浏览(45)
  • Python十类常见异常类型(附捕获以及异常处理方式)

    大家好,我是辣条哥!今天给大家讲讲我们刚开始写代码是都会出现的问题-我们刚开始常见的异常以及处理方法! 异常是指在程序运行过程中出现的错误或异常情况,例如除以0、访问不存在的变量等。Python提供了一些内置的异常类型,同时也支持自定义异常类型。 想找辣条

    2024年02月08日
    浏览(84)
  • 【Rust】枚举类型创建单链表以及常见的链表操作方法

    目录 单链表 用枚举表达链表 枚举enum Box容器 创建节点 1. 创建并打印 2. match 匹配 3. 节点初始化 4.节点嵌套 追加节点 1. 尾插法 2. 链表追加方法 3. 头插法 4. 改写成单链表方法 遍历链表 1. 递归法 2. 递推法 3. 改写成单链表方法  自定义Display trait 创建链表 1. 递归法 2. 递推法

    2024年02月15日
    浏览(40)
  • 第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例

    触发器是与表中数据相关的数据库对象,当表中的数据产生inster、update、delete这类操作时,可以通过触发器在这些动作之前或者之后,去完成相应的操作,例如向表中插入一条数据,插入数据之后通过触发器完成一些操作。 在触发器中会定义很多的SQL语句集合,当满足执行触

    2024年02月05日
    浏览(40)
  • 【C#】字符串包含的常见方法,Contains、Expect以及IndexOf等

    最近都在做C#相关的后台开发工作,会持续一段时间都是更新C#相关的文章,学习和开发C#方向的小伙伴可以浏览和支持下! Contains 方法是用于判断一个字符串是否包含另一个指定的子字符串。它的语法形式如下: value 参数是要查找的子字符串。如果字符串中包含该子字符串

    2024年02月16日
    浏览(39)
  • C#中使用list封装多个同类型对象以及组合拓展实体的应用

    在C#中,使用 ListT 集合是封装多个同类型对象的常用方式。 ListT 是泛型集合, T 是集合中元素的类型。下面是一个简单的例子,演示如何创建一个 ListT ,并向其中添加对象。 首先,假设我们有一个类,比如一个 Person 类,它有一些属性: 然后,我们可以这样使用 ListT : 上

    2024年02月22日
    浏览(40)
  • 【云原生技术】云计算中,一些常见的Python框架以及它们对应的应用类型和主要用途

    Python有多个框架,每个框架适用于不同类型的应用程序。下面将介绍一些常见的Python框架以及它们对应的普通(普通应用)、原生(原生应用)、Mesh(Mesh应用)应用类型以及它们各自的主要用途: 1. Django: 应用类型: 普通应用:Django适用于构建各种类型的Web应用,包括博

    2024年01月21日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包