一文带你搞懂数据库事务

一文,搞懂,数据库,事务 · 浏览次数 : 600

小编点评

**数据库事务简介** 数据库事务是指一系列数据库操作的不可分割工作单位,事务保证在执行过程中操作的完整性、一致性和隔离性。 **四种事务特性** 1. 原子性:事务操作是不可分割的,要么全部执行成功,要么全部执行失败。 2. 一致性:在执行该事务操作前后,从一个正确状态转换为另一个正确状态。 3. 隔离性:多个事务并发执行时,相互之间不会产生影响。 4. 持久性:一个事务被提交之后,对于数据库中数据的改变是永久的。 **事务隔离级别** 1. Read uncommitted:最低级别,无法解决脏读问题。 2. Read committed:读已提交,可以避免脏读问题发生。 3. Repeatable Read:确保事务可以多次从一个字段中读取相同的值,可以避免脏读和不可重复读,但仍会出现幻读问题。 4. Serializable:最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行。

正文

本文由葡萄城技术团队于博客园原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 

谈起数据库,事务是绕不开的话题。无论你是研发、实施还是运维,都需要理解、使用无数据事务的特性。数据库事务连接各种数据,是处理各种数据的基础。那么数据库事务究竟是什么意思?数据库事务又有什么特性呢?下面大家就跟随本文一起来搞懂数据库事务吧!

一、什么是事务

举个例子:A(余额1500元)向B(余额500元)银行转账500元,这里面会涉及到两个操作。

1、 A的账户余额减少500,此时余额应为1000元。

2、 B的账户余额增加500,此时余额应为1000元

如果这两个操作中间出现了失误,比如银行系统突然崩溃了,导致A账户余额减少500,但是B账户余额并没有增加,这样的系统明显是有问题的。要么A转账成功(两个操作全部完成),要么A转账失败(两个操作全部不执行),这样AB用户才能接受这样的转账结果。

所以,事务指的就是一个操作,由多个步骤组成,要么全部成功,要么全部失败。

二、理解数据库的事务

从数据库的角度来理解,事务指的是对数据库操作的序列,是一个不可分割的工作单位,这个序列中的操作要么全部执行,要么全部不执行。

数据库事务具有四个特性,称为 ACID 特性:

1、 原子性

事务是最小的执行单位,不允许分割。事务的原子性保证操作全部执行或全部不执行。

2、 一致性

一致性表示在执行该事务操作前后,从一个正确状态转换为另一个正确状态。以银行转账为例,转账前AB余额共有1500+500合计2000元,转行后AB余额应为1000+1000合计2000元,两种状态的合计余额应是一致的,不会多或者少。

3、 隔离性

隔离性表示多个事务并发执行时,相互之间不会产生影响,各并发事务之间数据库是独立的。

A向B转账过程中,只要事务还未提交,那么此时AB两账户的余额不会有变化。如果A向B转账(执行了一个事务)的同时,C又向B转账(执行了另一个事务),当两个事务都结束时,B账户的余额应为“原余额+B转账金额+C转账金额”。

4、 持久性

一个事务被提交之后,对于数据库中数据的改变是永久的,即使数据库发生了故障修改的数据也不会丢失。

三、事务隔离级别

对于两个并发执行的事务,如果涉及到对同一条数据做的操作,可能会出现以下问题:

1、 脏读(Ditry Read / Read Uncommitted)

脏读,是指一个用户读取到了另一个用户没有提交的数据。如:

用户A和用户B提交事务之后,发现最后的库存为1。但是因为A的提交回滚了,所以正确的库存应为5。

如何解决脏读呢?读已提交。控制一个事务只能读取其他事务提交后的数据。

2、 不可重复读(Unrepeatable Read)

不可重复读,是指同一个事务中,两次读取相同数据,返回的结果不一样。

不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这可能导致锁竞争加剧,影响性能。

3、 幻读(Phantom Read)

前面讲的不可重复读是发生在两次读取之间,数据被更新了的情况。如果两次操作之间,插入了新的数据呢?

上面例子中,用户B的更新结果与预期不符,仿佛产生了幻觉。

不可重复读和幻读,是两个容易混淆的概念,不可重复读是发生在一行数据上的,因此可以通过锁定行来解决。幻读是发生在多行记录中的,因此可以通过锁定表来解决

为了解决上面的并发问题,数据库系统提供了隔离级别的概念。

  • Read uncommitted (读未提交):最低级别,以上问题均无法解决。
  • Read committed (读已提交):读已提交,可以避免脏读问题发生。
  • Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段进行更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • Serializable (序列化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。

四、数据库锁

在数据库中多个SQL语句在同一时刻修改数据,会产生并发控制的问题,如果不加以控制,就会造成事务中的隔离性被破坏,引起不可预知的错误。实现并发访问可以采用两种类型的锁,即读锁/共享锁和写锁/排它锁:

  • 读锁/共享锁:共享的锁,多个客户端可以同时读取一个资源,互补干扰。如事务A对数据加上共享锁,那么事务B可以读取数据,不能修改数据。
  • 写锁/排它锁:一个锁会阻塞其他的写锁和读锁,确保一个时刻只有一个事务对数据进行修改写入。如事务A对数据加上排他锁,那么事务B不能读取数据,也不能修改数据。

以上就是数据事务库的内容与特性,如果您想进一步了解与学习,欢迎留言评论与我们交流。

 

与一文带你搞懂数据库事务相似的内容:

一文带你搞懂数据库事务

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 谈起数据库,事务是绕不开的话题。无论你是研发、实施还是运维,都需要理解、使用无数据事务的特性。数据库事务连接各种数据,是处理各种数据的基础。那么数据库事务究竟是什么意思?

【长文】带你搞明白Redis

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每...

3分钟带你搞定Spring Boot中Schedule

一、背景介绍 在实际的业务开发过程中,我们经常会需要定时任务来帮助我们完成一些工作,例如每天早上 6 点生成销售报表、每晚 23 点清理脏数据等等。 如果你当前使用的是 SpringBoot 来开发项目,那么完成这些任务会非常容易! SpringBoot 默认已经帮我们完成了相关定时任务组件的配置,

一文带你搞懂 Google 发布的新开源项目 GUAC

随着软件供应链攻击的显著增加,以及 Log4j 漏洞带来的灾难性后果和影响,软件供应链面临的风险已经成为网络安全生态系统共同关注的最重要话题之一。根据业内权威机构 Sonatype 发布的2022软件供应链现状报告,在过去三年中,针对上游开源代码存储库的恶意活动,旨在将恶意软件植入软件组件的攻击数量

一文带你搞懂如何优化慢SQL

最近通过SGM监控发现有两个SQL的执行时间占该任务总执行时间的90%,通过对该SQL进行分析和优化的过程中,又重新对SQL语句的执行顺序和SQL语句的执行计划进行了系统性的学习,整理的相关学习和总结如下;

[转帖]一文带你搞懂 CDN 的技术原理

http://blog.itpub.net/31545813/viewspace-2924432/ 网络通信/物联网 编辑:李雪薇 时间:2022-11-22 09:11:41 1330 0 CDN 的全称是 Content Delivery Network,即内容分发网络。其目的是通过在现有的In

[转帖]一文带你搞懂xxl-job(分布式任务调度平台)

https://zhuanlan.zhihu.com/p/625060354 前言 本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使用 xxl-job 并分享一个实战案例。 那么下面先说明什么是 xxl-job 以及为什么要使用它。

[转帖]图文结合带你搞懂 MySQL 日志之 Slow Query Log(慢查询日志)

https://my.oschina.net/GreatSQL/blog/5719211 GreatSQL 社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL 是 MySQL 的国产分支版本,使用上与 MySQL 一致。 作者:KAiTO 文章来源:GreatSQL 社区

带你彻底搞懂递归时间复杂度的Master公式

网上找到的Master公式推导过程都太过于复杂了,为此我特地找到一种小白也能看懂的推导过程。看完这篇文章后,你会对递归的时间复杂度深谙于心,打死都不会忘记。

手把手带你搞定用户权限控制

在实际的软件项目开发过程中,用户权限控制可以说是所有运营系统中必不可少的一个重点功能,根据业务的复杂度,设计的时候可深可浅,但无论怎么变化,设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计一套可以精确到按钮级别的用户权限功能呢? 今天通过这篇文章一起来了解一下相关的实现逻辑,不多说