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

2024-05-08 20:20

本文主要是介绍从谚语:“一手交钱,一手交货来”谈谈什么是数据库事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务与交易

一手交钱,一手交货

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

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技术与架构

这篇关于从谚语:“一手交钱,一手交货来”谈谈什么是数据库事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971343

相关文章

Mysql数据库聚簇索引与非聚簇索引举例详解

《Mysql数据库聚簇索引与非聚簇索引举例详解》在MySQL中聚簇索引和非聚簇索引是两种常见的索引结构,它们的主要区别在于数据的存储方式和索引的组织方式,:本文主要介绍Mysql数据库聚簇索引与非... 目录前言一、核心概念与本质区别二、聚簇索引(Clustered Index)1. 实现原理(以 Inno

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

详解Spring中REQUIRED事务的回滚机制详解

《详解Spring中REQUIRED事务的回滚机制详解》在Spring的事务管理中,REQUIRED是最常用也是默认的事务传播属性,本文就来详细的介绍一下Spring中REQUIRED事务的回滚机制,... 目录1. REQUIRED 的定义2. REQUIRED 下的回滚机制2.1 异常触发回滚2.2 回

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定