mysql加强(7)~事务、事务并发、解决事务并发的方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: mysql加强(7)~事务、事务并发、解决事务并发的方法

一、事务Transaction(简写tx):

在数据库中,事务是指一组逻辑操作不可分割的多个操作---一个事务,从一个状态变成另外一个状态。),无论成或败,都作为一个整体进行工作,要么全部执行,要么全部不执行。


引入背景:银行转账突遇断电的bug


1、事务的ACID属性:

① 原子性:事务是满足原子操作单元的,要么都执行,要么都不执行。

② 一致性:事务必须使数据库从一个一致性状态变成另外一个一致性状态。事务开始和完成,数据必须保持一致。(数据不被破坏)'数据守恒'】

③ 隔离性:事务之间有各自的空间,事务之间不被打扰。并发执行的事务之间彼此相互独立、互相不干扰.

④ 持久性:事务一旦提交后,数据是永久性的、不可回滚。(数据的修改是永久的)

事务只是一个改变,是一些操作的集合,事务本身不具备4个特性,但是我们需要让事务满足ACID特性,才能称它为一个正确的事务。

■ 在开发中,我们可以不使用外键,但是必须要有事务(存储引擎- innoDB)


■ 处理事务的两个动作:

  • 提交 commit:当整个事务中,所有的逻辑操作都是正常执行成功。 --》提交事务
  • 回滚 rollback:当整个事务中,有一个或多个逻辑操作执行失败。 --》回滚事务,撤销该事务中所有的操作,恢复到最初的状态。


2、隔离级别:

  • 事务的ACID特性中的隔离性是具有级别的哈,所以才有事务并发出现的各种情况。
  • 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
  • mysql 是使用可重复读取(Repeatable Read), 保证了数据的读取一致性,避免了脏读、不可重复读。
  • 默认情况,mysql不会出现幻读[除非 select * from 表名 lock in share mode;]
  • mysql中锁是基于索引机制,也不会出现第一类丢失更新(回滚丢失)
隔离级别 脏读 不可重复读 幻读
oracle---读已提交(只是避免了脏读)
mysql---可重复读取(避免了脏读和不可重复读)

■ mysql中的4种隔离级别(重点看是否会出现脏读、不可重复读、幻读即可)


39.png



  • ■ 这里最严重的就是丢失更新问题【第一类丢失更新(回滚丢失)、第二类丢失更新(覆盖丢失)】
  • 读取未提交:会出现脏读,还有事务A的数据仍然会因为事务B的insert/update、delete 从而出现幻读、不可重复读
  • 读取已提交:未提交的写操作的事务不允许被其他事务访问到。避免了脏读,但是事务A的数据,仍然会因为事务B的insert/update、delete 从而出现幻读、不可重复读。
  • 可重复读取:避免了不可重复读,但是却有可能出现幻读。
  • 序列化:要求事务一个接着一个进行执行,不可能并发执行。


二、事务并发

1、数据库的事务并发问题:多个事务并发访问/修改同一个资源

★ 跟java中的线程问题---并发问题差不多,都是针对同一资源,同时访问/修改出现的问题。


事务并发可能导致的问题【例子:两个客户端同时对同一个银行账号进行操作,一个客户端进行存取,一个客户端进行取钱】

(1)第一类丢失更新:撤销rollback一个事务时,把其他事务已经提交更新的数据回滚掉了

(2)第二类丢失更新:提交commit一个事务时,把其他事务已经提交更新的数据覆盖掉了。

(3)脏读:A事务未提交,但是B事务却读取到A事务的结果【读取到了B事务未提交的结果】(破坏隔离性)

(4)幻读:A事务在本次事务中,自己未操作过的数据B事务insert了一些数据),A事务进行两次读取,发现第一次读取时,记录不存在,第二次读取,记录出现了(破坏一致性,insert)

(5)不可重复读:跟幻读类似,A事务在本次事务中,自己未操作过的数据B事务update/delete了一些数据),A事务进行两次读取,发现两次读取的记录值不同(破坏一致性,update/delete)


❀ 每一个事务是有自己的空间的概念


  • 【第一类丢失更新】回滚丢失,把前一个提交的事务的结果回滚到数据库最初的数

40.png


【第二类丢失更新】覆盖丢失,通过提交事务,把前一个提交的事务的结果给覆盖掉42.png


脏读: 事务A读到事务B未提交的更新数据 (Oracle不会出现脏读)


41.png


幻读:事务A第二次查询时,读到了事务B新增提交的数据,即事务A两次查询时的记录条数不同,"产生幻觉"。【一般使用表锁机制,防止新增数据。】


43.png


不可重复读:跟幻读类似(只是幻读是读到事务B新增数据),事务A第二次查询时,读到了事务B修改提交的数据,即事务A两次查询时的结果的值不同不同


44.png


三、解决事务并发的方法(悲观锁/乐观锁)

1、悲观锁:事务A在操作时,悲观地认为其他事务会进来干扰自己。---[用的比较多,非常安全]。

(1)悲观锁:使用数据库自身的排它锁机制 [★原理数据库自身的锁机制(写锁)]

  • DML操作会自动加上排它锁(排斥其他锁)
  • DQL操作需要我们手动加上排它锁
  • select * from 表名 for update;


■ 使用客户端工具Navicat模拟(开启两个命令行窗口,可以拖动出来方便查看)并发:


45.png


DML操作会自动加上排它锁(排斥其他锁)


46.png47.png


DQL操作需要我们手动加上排它锁


48.png


■ 查询事务加上了 for update,其中一个事务处于阻塞状态,等着另一个事务的提交或回滚。


49.png


2、乐观锁:事务A在操作时,乐观地认为其他事务不会进来干扰自己。

(1) ★原理:在表中额外添加一个列,用来表示修改的版本(整型类型),修改一次就把版本增加1.

  • 举例:事务A并发修改person表中的name字段。

50.png

51.png

(2)乐观锁的操作步骤:


52.png





相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
3月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
5月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
981 1
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
214 0
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
391 10
|
2月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
121 0
|
4月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
222 11
|
4月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
172 1
|
6月前
|
SQL 数据采集 关系型数据库
实现MySQL与SQL Server之间数据迁移的有效方法
总的来说,从MySQL到SQL Server的数据迁移是一个涉及到很多步骤的过程,可能会遇到各种问题和挑战。但只要精心规划、仔细执行,这个任务是完全可以完成的。
481 18

推荐镜像

更多