MySQL数据库之事务(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 一、事务的概念事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个 整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。事务通过事务的整体性以保证数据的一致性。事务能够提高在向表中更新和插入信息期间的可靠性。


示例5:

全局事务隔离级别和会话事务隔离级别都为RR(可重复读)。 可以防止脏读和不可重复读。

事务A修改数据未提交,开启事务B进行查看,看到的是修改前的数据。

事务A提交后,事务B查看到的仍然是修改前的数据。

事务B在结束前,查询到的结果是一致的。事务A做的修改不影响事务B的查询结果。

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


3.2 测试事务回滚rollback

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

网络异常,图片无法展示
|


网络异常,图片无法展示
|



3.3 创建回滚点并进行回滚

  • SAVEPOINT S1: 使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称。
  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点。

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


四、使用 set 设置控制事务


在mysql中执行单独的命令会立即生效,是因为Mysql默认开启自动提交。

使用 set 设置控制事务:

set AUTOCOMMIT=0;       #禁止自动提交(仅针对当前会话)
 set AUTOCOMMIT=1;       #开启自动提交(仅针对当前会话),Mysql默认为1
 set global AUTOCOMMIT=0;    #禁止自动提交(针对全局事务)
 set global AUTOCOMMIT=1;    #开启自动提交(针对全局事务),Mysql默认为1
 show variables like 'AUTOCOMMIT';   #查看当前会话的AUTOCOMMIT值
 show global variables like 'AUTOCOMMIT';  #查看全局事务的AUTOCOMMIT值
复制代码


  • 如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback; 或 commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
  • 如果开起了自动提交,mysql 会把每个sql 语句当成一个事务,然后自动的commit。
  • 当然无论开启与否,begin; commit | rollback; 都是独立的事务。


示例1:开启自动提交

网络异常,图片无法展示
|


网络异常,图片无法展示
|



网络异常,图片无法展示
|


示例2:禁止自动提交

网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


对当前会话设置关闭自动提交,退出后重新进入,系统又会自动开启(因为全局事务默认开启自动提交,如果全局设置为关闭自动提交,则重新连接后会是关闭状态):


网络异常,图片无法展示
|
网络异常,图片无法展示
|


五、设置隔离级别的另一种方式


设置全局事务隔离级别和会话事务隔离级别,也可以使用为变量赋值的方式。

5.1 设置全局事务隔离级别:

set global transaction isolation level 隔离级别;  #永久生效
 set @@global.tx_isolation='隔离级别';   #重启mysql服务后失效,必须使用大写,如READ-COMMITTED
 set global tx_isolation='隔离级别';    #重启mysql服务后失效,必须使用大写,如REPEATABLE-READ
复制代码


示例:

set global transaction isolation level read committed;  #将全局事务隔离级别设置为提交读(RC)
 set @@global.tx_isolation='REPEATABLE-READ';   #必须使用英文大写
 set global tx_isolation='READ-COMMITTED';      #必须使用英文大写   
复制代码


网络异常,图片无法展示
|


5.2 设置会话事务隔离级别:

会话事务隔离级别只对当前连接有效,在其他终端连接无效,退出连接后即失效。

再次连接后会恢复为全局事务的隔离级别。

set session transaction isolation level 隔离级别;   #退出连接后失效
 set @@session.tx_isolation='隔离级别';   #退出连接后失效,必须使用大写,如READ-COMMITTED
 set session tx_isolation='隔离级别';     #退出连接后失效,必须使用大写,如READ-COMMITTED
复制代码


示例:

set session transaction isolation level read committed;  #将会话事务隔离级别设置为提交读(RC)
 set @@session.tx_isolation='REPEATABLE-READ';   #必须使用英文大写
 set session tx_isolation='READ-COMMITTED';      #必须使用英文大写   
复制代码


网络异常,图片无法展示
|


总结


事务的ACID特性:

  • 原子性(Atomicity)
  • 一致性(Consistency )
  • 隔离性(Isolation)
  • 持久性(Durability)

这是可靠数据库所应具备的几个特性。

事务之间的相互影响

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

事务的隔离级别:

(1)未提交读(Read Uncommitted(RU)) :允许脏读。

(2)提交读(Read Committed (RC)) :防止脏读。

(3)可重复读(Repeatable Read(RR)):—mysql默认的隔离级别,防止脏读和不可重复读。

(4)串行读(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 隔离级别; #永久生效
  • 示例: set global transaction isolation level read committed;

设置会话事务隔离级别:

  • set session transaction isolation level 隔离级别; #退出连接后失效
  • 示例:set session transaction isolation level read committed;

事务控制语句:

  • BEGIN 或 START TRANSACTION: 显式地开启一个事务。
  • COMMIT 或 COMMITWORK: 提交事务,并使已对数据库进行的所有修改变为永久性的。
  • ROLLBACK 或 ROLLBACK WORK: 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
  • SAVEPOINT S1: 使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称。
  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点。

使用 set 设置控制事务:

set autocommit=0; #禁止自动提交(仅针对当前会话)

set autocommit=1; #开启自动提交(仅针对当前会话),Mysql默认为1

set global autocommit=0; #禁止自动提交(针对全局事务)

set global autocommit=1; #开启自动提交(针对全局事务),Mysql默认为1

show variables like 'autocommit';   #查看当前会话的autocommit值

show global variables like 'autocommit';     #查看全局事务的autocommit值

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 存储 关系型数据库
MySQL----事务
MySQL----事务
22 3
|
8天前
|
SQL 关系型数据库 MySQL
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
MySQL 事务回滚。在执行删除、更新等操作时,防止误操作
21 2
|
4天前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
28天前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
148 70
|
3天前
|
存储 SQL 关系型数据库
深入解析MySQL事务机制和锁机制
深入解析MySQL事务机制和锁机制
|
5天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
19天前
|
SQL 关系型数据库 MySQL
(七)MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
众所周知,MySQL数据库的核心功能就是存储数据,通常是整个业务系统中最重要的一层,可谓是整个系统的“大本营”,因此只要MySQL存在些许隐患问题,对于整个系统而言都是致命的。
|
19天前
|
SQL 算法 关系型数据库
(十)全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
经过《MySQL锁机制》、《MySQL-MVCC机制》两篇后,咱们已经大致了解MySQL中处理并发事务的手段,不过对于锁机制、MVCC机制都并未与之前说到的《MySQL事务机制》产生关联关系,同时对于MySQL锁机制的实现原理也未曾剖析,因此本篇作为事务、锁、MVCC这三者的汇总篇,会在本章中补全之前空缺的一些细节,同时也会将锁、MVCC机制与事务机制之间的关系彻底理清楚。
|
4天前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。

热门文章

最新文章