mysql 事务基本介绍

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: mysql 事务基本介绍

命令小结

show global variables like '%isolation%';
查询全局事务隔离级别
show session variables like '%isolation%';
查询会话事务隔离级别
set global transaction isolation level read committed;
设置全局事务隔离级别
set session transaction isolation level read committed;
设置会话事务隔离级别
BEGIN 显式地开启一个事务
COMMIT 提交事务,并使已对数据库进行的所有修改变为永久性的
ROLLBACK 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1

使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1 把事务回滚到标记点。
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; 开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; 查看Mysql中的AUTOCOMMIT值

一      MySQL事务的概念

(一)事务介绍

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。这样,这些数据库操作语句就构成一个事务!

 

(二)事务特点

●事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体           一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

●事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

●事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

●事务是通过事务的整体性以保证数据的一致性。

说白了,所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

 

(三)事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

1,原子性

指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

1.1 原子性具体形容

事务是一个完整的操作,事务的各元素是不可分的。

事务中的所有元素必须作为一个整体提交或回滚。

如果事务中的任何元素失败,则整个事务将失败。

1.2 原子性案例

A给B转帐100元钱的时候只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么都执行,要么就都不执行。

2 ,一致性

指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

2.1一致性具体介绍

当事务完成时,数据必须处于一致状态。

在事务开始前,数据库中存储的数据处于一致状态。

在正在进行的事务中,数据可能处于不一致的状态。

当事务成功完成时,数据必须再次回到已知的一致状态。

2.2 一致性案例

案例:

对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致。

 

3,隔离性

指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

3.1 隔离性具体介绍

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

 

4 ,持久性

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

4.1 持久性具体介绍

指不管系统是否发生故障,事务处理的结果都是永久的。

一旦事务被提交,事务的效果会被永久地保留在数据库中。

二    事务之间的相互影响

(一)脏读(读取未提交数据)

1,脏读定义

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读

2,案例

比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。 也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

(二)不可重复读(前后多次读取,数据内容不一致)

1,不可重复读定义

个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

 

(三)幻读(前后多次读取,数据总量不一致)

1,幻读定义

一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样。

(四)丢失更新

1,丢失更新定义

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

2,案例

A B 同时修改 一个数据

A B 先后提交事务 B 会覆盖A 的数据

(五)不可重复读 和幻读区别

  • 发生的原因不同。不可重复读主要是由于在同一个事务内,其他事务对数据进行了修改(如更新或删除)操作,导致事务内多次读取同一数据时,得到的结果不一致。而幻读则主要是由于在同一个事务内,其他事务插入了新的满足查询条件的数据,或者在事务执行过程中,有数据被删除,导致再次执行相同的查询时,得到的结果集与之前不同。
  • 表现形式不同。不可重复读关注的是单个数据行的内容变化,即事务内多次读取同一数据行的值,可能因为其他事务的修改而有所不同。而幻读关注的是数据行的增加或减少,即在事务内多次查询满足条件的记录集时,可能因为其他事务插入了新的满足条件的数据行或者删除了某些数据行,而导致查询结果集的改变。

即不可重复读 是前后读取 看到数据内容不一致

  幻读            是前后读取 看到数据总量不一致

(六)总结

三    Mysql及事务隔离级别(四种)

(一)read uncommitted  未授权读取

允许脏读取,即一个事务可以读取到另一个未提交事务修改的数据。但同时,不允许更新丢失

安全性最差   但性能最好 (不使用)

(二)Read Committed   授权读取

允许不可重复读取,即一个事务只能读取已经提交的数据。这样可以避免脏读问题,但仍然可能存在不可重复读和幻读问题。

安全性较差  性能较好  (oracle 数据库 默认就是这种)

(三)Repeatable Read   可重复读取

在这个级别下,一个事务在执行过程中多次读取相同的数据时,能够保证数据不会被其他事务修改。这可以避免脏读和不可重复读,但仍然可能存在幻读问题。

可以解决脏读 和 不可重复读 —mysql默认的

可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响

安全性较高,性能较差 (mysql 默认的就是这种)

(四)Serializable 串行化

这是最高的隔离级别,事务会按顺序一个接一个地执行,不允许并发执行。这可以避免脏读、不可重复读和幻读等并发问题,但会降低系统的并发性能

安全性高  性能差   不使用

 

四  事务隔离级别的作用范围

全局级:对所有的会话有效
会话级:|只对当前的会话有效

(一)查询全局事务隔离级别

show global variables like '%isolation%';  

展示全局 变量  像%隔离%   (此处%% 是模糊处理

SELECT @@global.tx_isolation;

 

(二)查询会话事务隔离级别

show session variables like '%isolation%';

SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

 

(三)设置全局事务隔离级别

set global transaction isolation level read committed;

 

(四)设置会话事务隔离级别

set session transaction isolation level read committed;

五    事务控制语句

(一)开启事务

BEGIN 或 START TRANSACTION:显式地开启一个事务。

(二)提交事务

COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

(三)回滚

OLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

(四)设置回滚点

SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

(五)回滚到回滚点

ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

(六)实例回滚

1 创建数据库

2 创建表

3,原始表数据如下:

4,begin  开启事务

5,设置回滚点1

6,插入 貂蝉数据

7,设置回滚点2

8,插入文丑  数据

9,目前 表数据

10,  回到 回滚点2

11, 回到回滚点1

六   使用 set 设置控制事务

(一)命令

SET AUTOCOMMIT=0;                                                           #禁止自动提交

SET AUTOCOMMIT=1;                                                          #开启自动提交,Mysql默认为1

SHOW VARIABLES LIKE 'AUTOCOMMIT';                          #查看Mysql中的AUTOCOMMIT值

(二)注意事项

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
当然无论开启与否,begin; commit|rollback; 都是独立的事务。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
6月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
7月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
4月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
321 0
|
5月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
214 0
|
7月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
208 1
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
5289 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
725 7
MySQL事务日志-Undo Log工作原理分析
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
314 43
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
2449 14
MySQL事务日志-Redo Log工作原理分析

推荐镜像

更多