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

news2024/12/24 3:44:09

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

目录

  • 1、C#事务概念
    • 1.1、逻辑单元
    • 1.2、Transaction对象
    • 1.3、事务简单实例
  • 2、事务场景描述
  • 3、事务流程图
    • 3.1、没有事务流程
    • 3.2、有事务流程
  • 4、常见事务类型

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)如果是支付流程,则影响就非常大了
假如支付成功,用户已经付款了,但是支付状态还是未支付状态,这个业务影响就大了
在这里插入图片描述

3.2、有事务流程

1)页面发起API请求
2)API执行内容逻辑代码
3)执行A表添加,不成功则响应信息回页面,回滚事务
4)A表添加成功,则继续执行下一步代码逻辑
5)执行B表更新,不成功则响应信息回页面,回滚事务
此时,事务已经回滚,A表记录添加成功则撤销,A和B表操作,要么都成功,要么都失败
6)B表更新成功,则响应成功信息回页面
此时A和B都执行成功,就可以提交事务,完成两次成功操作
在这里插入图片描述

4、常见事务类型

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

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

这些是一些常见的C#事务类型。开发小伙伴应确保选择适当的事务类型以确保数据的一致性和完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑客是怎样练成的?

网学黑客技术的人越来越多了,不少人都不知道该怎么学,今天就来详细的说一说黑客是如何炼成的。 首先,什么是黑客? 黑客 :泛指擅长IT技术的电脑高手 黑客一词,源自英文Hacker,早期其实就是一群…

【MySQL】一文带你了解检索数据

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指…

21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机

文章目录 21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机21.1 背景介绍22.2 RBM模型表示22.3 Inference问题22.4 Marginal问题 21 RBM(Restricted Boltzmann Machine)——受限玻尔兹曼机 21.1 背景介绍 什么是玻尔兹曼机: 简单来说就是具有条件的Marko…

无线蓝牙耳机排行榜,十大口碑最好蓝牙耳机

近年来,随着生活水平的提高,越来越多的人对高品质蓝牙耳机的需求日益增加。无论我们在选购什么产品,我们都会考虑一个价值范围,买蓝牙耳机也是同样,都会给自己一个预算,然后根据预算去网上搜寻这个价格范围…

【python学习】-读入xlsx文件,将datetime.time转为minute的格式,并将新数据存入csv文件

读入xlsx文件&#xff0c;将datetime.time转为minute的格式&#xff0c;并将新数据存入csv文件 任务概要思路设计代码实现导入相关库时间转换函数算法内核csv文件结果 接到一个需求&#xff0c;师兄在做稳定性测试时&#xff0c;时间显示格式为<class ‘datetime.time’>…

深入剖析 Python 函数参数传递机制及高级应用

前言 在本篇文章中&#xff0c;笔者将带你深入探讨 Python 函数传参的进阶主题。 通过阅读本篇文章&#xff0c;你可以深入了解 Python 函数传参的进阶主题&#xff0c;掌握更多高级的函数技巧&#xff0c;提升你的 Python 编程能力。 前面分享了Python 函数传参基础篇&#xf…

图像生成--对抗生成模型

生成模型概述 对抗生成模型 机器学习中的两大主要问题&#xff1a; 判别生成 判别模型的典型代表即为图像分类任务&#xff0c;即给定一个数据&#xff0c;判定他是哪一类。 判别模型学习到的是一个概率&#xff08;贝叶斯过程&#xff09; 而生成模型的区别在于&#xf…

【Elacticsearch】 原理/数据结构/面试经典问题整理

对Elacticsearch 原理/数据结构/面试经典问题整理的文章&#xff1b; 映射 | Elasticsearch: 权威指南 | Elastic Elacticsearch介绍 Elasticsearch,这里简称ES。ES是一个开源的高可用高扩展的分布式全文搜索与分析引擎&#xff0c;可以提供PB级近实时的数据存储和检索能力&am…

SpringBoot自定义starter入门

一、创建一个普通的Maven项目 pom.xml文件修改 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

你知道如何将音频转文字吗?

我跟你们说&#xff0c;我认识一名盲人音乐人&#xff0c;他很热爱音乐创作&#xff0c;但是因为听力的限制&#xff0c;无法像其他人那样从录音中获取音乐素材。然而&#xff0c;有一天他听说了一个神奇的功能——音频转文字&#xff0c;这个功能可以将音频文件转换成文字文本…

从技术谈到管理,把系统优化的技术用到企业管理

很多技术人员在职业上对自己要求高&#xff0c;工作勤奋&#xff0c;承担越来越大的责任&#xff0c;最终得到信任&#xff0c;被提拔到管理岗位。但是往往缺乏专业的管理知识&#xff0c;在工作中不能从整体范围优化工作流程&#xff0c;仍然是“个人贡献者”的工作方式&#…

低功耗晶振电路设计

晶振电路设计 晶振中负性阻抗的原理 晶振的回路主要由两部分组成&#xff0c; 一部分是激活分支&#xff0c; 用于提供能量给晶振启动直至达到稳定的相位&#xff0c;另一部分是被动分支&#xff0c; 主要由电阻&#xff0c; 两个外部负载电容以及所有的寄生电容&#xff0c;…

手写RPC总结篇

协议制定&#xff1a;client到server做交互的通信协议&#xff0c;比如request response 网络端点peer 难点1 : Jetty嵌入 ◆jetty Server ◆ServletContextHandler ◆ServletHolder jetty server 起到网络监听的作用ServletContextHandler注册到jetty server中ServletHolde…

测试开发之Python自动化 Pytest 之 fixture

Pytest 之 fixture unittest 和 nose 都支持 fixture 的,但是 fixture 在 pytest 里使用更灵活。也算是 pytest 的一个闪光点吧可以理解为一个跟 setup 和 teardown 这种前后置类似的东西。但是比它们要强大、灵活很多 fixtur 当做参数传入 # -*- coding: utf-8 -*-import p…

图像处理实战02-yolov5目标检测

yolov5 YOLOv5 是一种目标检测算法&#xff0c;它是 YOLO (You Only Look Once) 系列算法的最新版本。YOLOv5 采用了一种新的架构&#xff0c;它包括一个基于 CSPNet (Cross Stage Partial Network) 的主干网络以及一系列改进的技巧&#xff0c;如多尺度训练、数据增强、网络混…

互联网行业-镭速文件传输系统方案

互联网行业是一个快速变化和高度竞争的行业&#xff0c;这一行业需要传输大量的数据、代码和文件。在互联网企业的生产和运营过程中&#xff0c;需要传输各种敏感和大型的文件&#xff0c;例如业务报告、数据分析、软件代码等。这些文件需要在不同的部门、不同的地点之间高效地…

微服务springcloud 07 hystrix + turbine 集群聚合监控

01.hystrix dashboard 一次只能监控一个服务实例&#xff0c;使用 turbine 可以汇集监控信息&#xff0c;将聚合后的信息提供给 hystrix dashboard 来集中展示和监控 02.新建 sp10-turbine 项目 03.pom.xml <?xml version"1.0" encoding"UTF-8"?&…

C语言---malloc(0)会产生什么结果,真的是空指针吗?

前言 &#xff08;1&#xff09;几天前在一个交流群中看到有人说&#xff0c;面试问malloc(0)会怎么样是真的恶心。 &#xff08;2&#xff09;这个突然激起了我的好奇心。居然还可以malloc(0)&#xff1f;&#xff01; &#xff08;3&#xff09;经过测试最后&#xff0c;发现…

基于Java学生课外知识学习网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

PulsarMQ系列入门篇

文章目录 介绍&#xff1a;部署安装讲解:安装单机版本测试&#xff08;Linux下&#xff09;&#xff1a; 介绍&#xff1a; PulsarMQ 现托管于apache Apache 软件基金会顶级项目&#xff0c;2016年由雅虎公司开源的分布式多租户消息中间件 &#xff0c;是下一代云原生分布式消息…