从谚语:“一手交钱,一手交货来”谈谈什么是数据库事务

事务与交易

一手交钱,一手交货

一手交钱,一手交货,谚语,意思是指钱和货当场相交,互不拖欠。出自明朝施耐庵《水浒传》第二一回。

Transaction 意思

我们先来看一下来自于剑桥英-英词典的解释:

transaction
noun [ C or U ]
UK /trænˈzæk.ʃən/ US /trænˈzæk.ʃən/

an occasion when someone buys or sells something, or when money is exchanged or the activity of buying or selling something

剑桥英语
当某人购买或销售物品,或者进行货币交换,或者进行购买或销售活动时发生的场合。

交易背后的逻辑

  • 涉及不同的利益体
    • 买、卖双方
  • 涉及多个动作
    • 买家付钱
    • 卖家给货
  • 涉及物品状态的变化
    • 买家的钱付出去了,得到了货物
    • 卖家的货给出去了,得到了金钱
  • 有据可查
    • 卖家应该开发票或交易凭证给买家,卖家留存根。
    • 也可以理解为买卖合同,一式两份,甚至是一式三份。

什么是事务

实际上上面所举的例子,就是一种社会规则,如果没有这个规则社会就会乱套。因为现如今的生活已经完全被数字化了,我们所有的行为都能反映到数字世界,数字世界的行为也需要遵循社会规则,不能乱套。

数据库事务就是这样一种机制,避免行为所产生的结果出现混乱,也就我们所说的要保证数据的完整性和一致性。

事务的定义

数据库事务是指一组数据库操作,这些操作被视为一个单独的工作单元,要么全部成功执行,要么全部失败回滚。事务通常用于确保数据库的一致性和完整性,以及支持数据的可靠处理。

事务的特性

为了达成这个目录,数据库事务就需要具备以下四种特性,也就是通常我们提到的ACID:

  • A - Atomicity
    原子性,事务是原子的,要么全部执行,要么全部不执行(回滚)。
  • C - Consistency
    一致性,事务执行的结果必须是使数据库从一个一致的状态转移到另一个一致的状态。
  • I - Isolation
    隔离性,事务的执行应该被隔离开来,即使有多个事务同时执行,它们也不会相互干扰。
  • D - Durability
    持久性,一旦事务成功完成,其结果应该是永久性的,即使系统发生故障,也应该能够保证数据的持久性。

A - Atomicity 原子性
作为买家,我们去买东西,我们给钱了,就必然要拿到货。
同理,作为卖家,他把商品给我们了,他就一定要收到钱。

这两个动作必须都发生,这笔交易才算达成。我给了钱,你不给货,那我就得把钱要回来,你给了货,我不给钱,你也得把货要回来,这就是回滚。

C - Consistency 一致性
还是拿买东西这个场景来说,比如说,我们去便利店买饮料,我们使用微信支付,我们拿了饮料后,需要将饮料给收银单服务员先扫码,这个过程是减库存,然后我们再微信支付。

这里涉及两个关键动作:减库存,和支付
减库存
一次交易,库存由原来的50瓶,减少1瓶,交易完成后剩余49瓶。
支付
我们的微信钱包,从10块钱,减少3.5元,交易完成后剩余6.5元。
这就叫从一个一致的状态转移到另一个一致的状态。

为什么要这样?道理很简单:东西不可能永远卖不完,钱也不可能永远花不完。行为导致结果,有行为,就会有结果。

I - Isolation 隔离性
指的是如果有多个行为同时发生的情况下,他们应该是互不干扰,也不会导致不一致的情况发生。

比如:80年代,商场推出了彩色电视机,在那个年代是紧俏的存在,大家都想买。商场有10个售货员同时在卖彩电,总共就100台,每卖出一台,商场都会实时在公告牌上更新剩余彩电的数量。

首先我们要保证剩余数量是准确的,我们还要保证只卖出去100台,如果有顾客付了钱,没买到彩电的,还得把钱退回去。

D - Durability 持久性
所谓持久性,就是指事务一旦成功,结果就会永远保存下来,也就是所有的交易要有交易凭证。交易凭证就是一种契约,是用来保护交易双方的合法权益的。

MySQL是怎么实现事务的

简单来讲主要就是通过日志、锁、多版本控制来保证事务的四大特性。

日志:redo log, undo log
锁:行锁,表锁,间隙锁,临键锁
多版本并发控制(Multi-Version Concurrent Control)

这些内容我们会在后面的文章中一个一个探讨。今天只是作个简单的介绍。

大家可以脑补一下,事务实现的关键在于什么?

  1. 所有的操作都有记录(log),出的问题可以根据记录回退。
  2. 我们在修改数据的时候,需要得到一把锁,这把锁就是权限,只允许拥有权限的人才能修改数据。

后续

希望今天这篇文章可以帮助到大家理解数据库事务的基本概念,我们将在后续文章中继续带大家探索以下几个方面的内容:

  • 数据库事务隔离级别
  • MVCC机制

关注我的公众号

欢迎大家关注、点赞、转发,一起交流软件开发、架构设计、云原生技术。
TXZQ聊IT技术与架构

内容概要:本文针对有源中点箝位(ANPC)三电平并网逆变器在复杂电网环境下的性能瓶颈,提出了一种融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相技术与电网电压前馈控制的一体化高性能并网控制策略。通过深入分析ANPC三电平拓扑在开关损耗均衡性、中点电位稳定性及输出电能质量方面的固有优势,构建了高可靠性的硬件基础;在此之上,DPWMA调制策略有效提升了开关频率利用率,显著降低了输出电流谐波含量;正负序分离锁相环(SRF-PLL)精准提取电网正序分量,解决了电网不平衡工况下传统锁相技术存在的相位检测偏差与并网电流不对称问题;电网电压前馈控制则通过前馈补偿机制,提前抑制电网电压扰动对并网电流的直接影响,大幅增强了系统在电压骤升、骤降等动态工况下的响应速度与鲁棒性。研究通过Simulink搭建了完整的仿真模型,对稳态运行、电网不平衡及动态切换等多种工况进行了全面验证,结果表明该复合控制策略能显著提升并网电能质量、锁相精度与系统动态稳定性,适用于新能源发电、大功率工业变流等对并网性能要求严苛的应用场景。; 适合人群:具备电力电子与电力系统基础知识,从事新能源发电、微电网、大功率变流器、电能质量治理等相关领域研究的研发人员及高校研究生。; 使用场景及目标:①解决传统三电平逆变器在电网不平衡条件下锁相不准、电流畸变严重的问题;②提升并网逆变器在电压骤升/骤降等动态扰动工况下的响应速度、抗扰能力与并网稳定性;③为高性能、高可靠性的并网控制系统设计提供一套可复现、可验证的技术方案与完整的仿真模型参考。; 阅读建议:建议读者结合文中提供的Simulink仿真模型,按照“拓扑分析-控制策略设计-仿真验证”的逻辑主线,循序渐进地理解各模块的设计原理,重点钻研正负序分离锁相与电网电压前馈控制的实现细节,并通过设置不同的电网扰动工况进行仿真实验,对比分析控制效果,从而深入掌握多技术协同优化的内在机理与工程应用价值。
代码转载自:https://pan.quark.cn/s/679a7257f458 在Windows操作系统环境中,开发多线程程序是一项普遍存在的编程需求,其主要目的是为了达成不同任务的并行处理,从而优化程序的执行效能。在C++开发情境下,我们一般会借助WinAPI提供的`_beginthreadex`函数来进行线程的构建,此方法具备跨操作系统的兼容性,并且是C运行时库(CRT)所包含的一部分。本文将深入剖析如何运用`_beginthreadex`函数来构建多线程以及相关的技术要点。 首先,让我们明确`_beginthreadex`函数的基本操作方法。该函数需要接收若干个参数,包括一个指向安全属性的指针、初始堆栈的尺寸、一个线程执行函数的指针、传递给线程执行函数的参数、线程的创建标识以及一个存放线程标识符的指针。线程执行函数是新线程将要运行的代码的起始位置。下面给出一个基础的实例代码: ```cpp uintptr_t thread_id; HANDLE hThread = (HANDLE)_beginthreadex( NULL, // 指向安全属性的指针,通常设置为NULL 0, // 堆栈尺寸,若传入0则表示采用系统默认值 ThreadFunction, // 指向线程执行函数的指针 NULL, // 传递给线程执行函数的参数,可以根据需求自定义 CREATE_SUSPENDED, // 线程的创建标识,可以选择使用CREATE_SUSPENDED来使线程处于挂起状态 &thread_id // 用于接收线程标识符的指针 ); ``` 在此代码中,`ThreadFunction`代表用户自定义的函数,它将作为新线程执行的起始点。例如: ```cpp D...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值