数据库来一发(一)数据库事务

2024-01-28 22:38
文章标签 数据库 事务 一发

本文主要是介绍数据库来一发(一)数据库事务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、数据库事务的意义

数据库事务是为了保证了一系列操作的原子性,并提供从失败中恢复的方法。另外数据库事务保证应用程序之间的隔离,避免事务之间的相互影响。

二、数据库事务的4大特性

  • 原子性(Atomicity):事务作为一个整体,要么都执行,要么都不执行。
  • 一致性(Consistency):是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
  • 隔离性(Isolation):多个事务之间不会互相影响。
  • 持久性(Durability):一旦事务成功提交,结果永久保存。

三、数据库误读现象

  • 脏读:读到了未提交的事务操作的数据,数据有可能是无效的。
  • 不可重复读:一个事务两次读之间,被另一事务修改了数据,导致两次读的结果不一致。
  • 幻读:由于其他事务的新增、删除等,导致本事务操作不全,比如另一事务插入了一行。

四、事务隔离级别

针对上述误读现象,数据库可以设定事务的隔离级别,隔离级别越高,可出现误读的场景越少,相应地并发能力就越低。

隔离级别从低到高依次为:未提交读(Read uncommitted)、提交读(Read committed)、可重复读(Repeatable reads)、可序列化(Serializable)。

  • 未提交读:事务在读数据的时候并未对数据加锁。
  • 提交读:事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
  • 可重复读:事务在读取某数据的瞬间,必须先对其加行级共享锁,直到事务结束才释放;事务在更新某数据的瞬间,必须先对其加行级排他锁,直到事务结束才释放。
  • 可序列化:事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;事务在更新数据时,必须先对其加表级排他锁 ,直到事务结束才释放。

共享锁:用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排他锁:用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

五、事务提交过程

1、bin log 、undo log 和redo log

1、undo log

数据库事务失败了怎么回滚?Mysql使用undo log来存储事务提交前的数据,这样在执行回滚时就可以从undo log中取数据。用undo log的事务执行过程简述如下:

1)事务开始;

2)将 a = 1 记录到undo log;

3)修改 a = 2;

4)将undo log 写到磁盘;(如果5失败了,可以依赖4进行回滚)

5)将数据写到磁盘;(5在6前是为了避免写磁盘失败,保证持久化成功)

6)提交事务。

 undo log 的缺陷是,每次执行事务要写undo log到磁盘,导致大量磁盘IO,性能很低。

2、redo log

和undo log不一样,redo log存的是新数据的备份,目的是将上述第5步数据持久化的过程替换为redo log的持久化,并且通过优化redo log持久化降低数据IO成本。undo和redo配合使用的过程如下:

1)事务开始;

2)将 a = 1 记录到undo log;

3)修改 a = 2;

4)将 a = 2 记录到redo log;

5)将redo log 写到磁盘;

6)提交事务。

7)数据写入磁盘。

参考资料:

https://www.jianshu.com/p/57c510f4ec28

https://blog.csdn.net/alexdamiao/article/details/51872477

这篇关于数据库来一发(一)数据库事务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

Spring Boot 事务详解(事务传播行为、事务属性)

《SpringBoot事务详解(事务传播行为、事务属性)》SpringBoot提供了强大的事务管理功能,通过@Transactional注解可以方便地配置事务的传播行为和属性,本文将详细介绍Spr... 目录Spring Boot 事务详解引言声明式事务管理示例编程式事务管理示例事务传播行为1. REQUI

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2