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

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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad