当前位置:网站首页>MySQL-TCL语言-transaction control language事务控制语言
MySQL-TCL语言-transaction control language事务控制语言
2022-08-03 08:36:00 【LXMXHJ】
文章目录
事务基础
概述
概念
事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
事务 = 一个或一组sql语句组成一个执行单元;这个执行单元要么全部执行,要么全部不执行。
每一个mysql语句是相互依赖的。
两个关键点
第一个,它是数据库最小的工作单元,是不可以再分的;
第二个,它可能包含了一个或者一系列的 DML 语句(database manipulation language),包括 insert delete update。 (单条 DDL(database define language)和 DQL(database query language)也会有事务)
使用事务原因
当一个业务流程涉及多个表的操作的时候,我们希望它们要么是全部成功的,要么都不成功,这时会启用事务。
案例
# 要求张三丰给郭襄转账500
表
张三丰 1000
郭襄 1000
update 表 set 张三丰的余额=500 where name = ‘张三丰’;
update 表 set 郭襄的余额=1500 where name = ‘郭襄’;
当出现语句1执行成功,但是由于某些原因,语句2没有得到执行。这样就会导致一个问题,张三丰的钱少了,但是并没有将其转给郭襄。
存储引擎
概念
在mysql中的数据用各种不同的技术存储在文件(或内存)中,又称存储引擎称为表类型。
存储引擎查看
show engines;
# 查看mysql支持的存储引擎。
常见存储引擎
Innodb、myisam、memory等。
其中innodb支持事务,而myisam、memory等不支持事务。
故innodb是默认存储引擎。
事务的ACID属性
原子性(atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
实现:
可以用 undo log 回滚日志来保证,回滚日志会记录当前事务的反向操作;
当事务执行过程中出现异常时,就会触发回滚,执行 undo log 日志的回滚操作,将数据恢复到事务开始执行前的状态。一致性(consistency)
事务必须使数据库从一个一致性状态变换到另一个一致性状态。
实现:
原子性和隔离性保证了数据库的一致性。隔离性(isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。
实现:
如果没有了隔离性,就可能会造成脏读、不可重复读和幻读的问题。所以事务与事务之间需要存在一定的隔离性,可以通过各种锁来实现。
其次,事务有四个隔离级别,分别是:读未提交、读提交(Oracle 默认)、可重复读(MySQL 默认)和串行化。持久性(durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永远性的,接下来的其他操作和数据库故障不应该对其有任何影响。
实现:
由 redo log (重做日志)以及 WAL(Write-Ahead Logging:先写日志再写磁盘) 技术来实现的。
当有一个更新数据的事务提交之后;InnoDB 存储引擎会先把更新的操作写到 redo log 日志里,并同时将数据更新到内存中(这里就是更新完成了),之后就是等待 InnoDB 将数据持久化到磁盘了。而如果在这等待的过程中,数据库发生异常重启了,也就是数据还没有被持久化到磁盘, 那这个时候就可以根据 redo log 将数据重新恢复到内存中,直到被持久化到磁盘中。
事务创建
事务的分类
隐式(自动)事务
含义
事务没有明显的开启和结束的标记,比如insert、update、delete语句 。案例
delete from 表 where id = 1 ;
- 启动方式查询
show variables like ‘autocommit’;
显式事务
含义
事务具有明显的开启和结束的标记前提
必须先设置自动提交功能为禁用。关闭事务自动提交功能
set autocommit = 0;
- 关闭事务指着对当前的事务有效。
显式事务具体操作步骤
①开启事务
set autocommit = 0;
start transaction; # 可以省略
② 编写事务中的逻辑sql语句(select insert update delete)
语句1;
语句2;
......
设置回滚点:savepoint 回滚点名;
③ 结束事务
commit; 提交事务
rollback; 回滚事务
rollback to 回滚点名; 回滚到指定的地方;
案例
事务的并发问题
事务的并发问题 = 多个事务 同时 操作 同一个数据库的相同数据。
同时运行多个事务,当它们访问数据库中相同的数据时,如果没有采取必要的隔离机制,则会导致各种并发问题。
问题介绍如下:
- 脏读:
两个事务T1和T2,T2更新但还没有提交的字段,T1读取了。若此时T2回滚,则T1读取到的就是临时且无效的。
(一个事务读取了其他事务没有提交的数据,读到的是其他事务“更新”的数据) - 不可重复读:
两个事务T1和T2,T1读取字段内容,之后T2更新了字段内容,T1再读取同一个字段,此时值不同。
(一个事务多次读取,结果不一样) - 幻读:
两个事务T1和T2,T1从一个表中读取一个字段,然后T2在该表中插入了新的行,之后T1再读同一个表,就会多出几行。
(一个事务读取了其他事务没有提交的数据,只是读到的是其他事务“插入”的数据)
数据库事务的隔离性
概述
数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别。
数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性约弱。事务的隔离级别
oracle
两种:read committed(默认)、serlalizable
mysql
四种:read uncommitted、read committed、repeatable read、serializable
隔离级别 | 描述 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
read uncommitted 读未提交数据 | 允许事务读取未被其他事务提交的变更。 脏读、不可重复读和幻读问题都会出现。 | √ | √ | √ |
read committed 读已提交数据 | 只允许事务读取已经被其他事务提交的变更。 不可重复读 和 幻读问题会出现 | – | √ | √ |
repeatable read 可重复读数据 | 确保事务可以多次从一个字段中读取相同的值,在此事务执行期间,禁止其他事务对这个字段进行更新。 幻读问题会出现 | – | – | √ |
serializable 串行化 | 确保事务可以从一个表中读取相同的行,在事务持续期间,禁止其他事务对该表执行插入、更新和删除的操作。 无问题存在 | – | – | – |
事务隔离级别演示
- 连接数据库
- 查看当前的默认隔离级别
每启动一个mysql程序,就会获取一个单独的数据库链接;
每个数据库链接都有一个全局变量@@tx_isolation,标识当前的事务隔离级别。
查看当前的隔离级别:select @@tx_isolation;
- 设置当前mysql连接的隔离级别
set [session] transaction isolation level 隔离级别;
- 设置数据库系统的全局隔离级别
set global transaction isolation level 隔离级别;
事务的状态
状态名 | 说明 |
---|---|
活动状态 | 事务对应的数据库操作正在执行 |
局部提交状态 | 事务的最后一个语句执行之后,但是还未写到磁盘中 |
失败状态 | 当事务处于活动或部分提交,出错无法继续执行,或人为停止当前事务提交 |
中止状态 | 回滚后的状态 |
提交状态 | 部分提交状态的事务将修改的数据写到磁盘之后。 |
中止 和 提交状态 才是事务最终的状态。
回滚点
语法
savepoint 节点名;
# 设置保存点,就是一个标识符位置
# 需要搭配
rollback to 节点名;
案例
delete 和 truncate 事务 区别
区别 | delete | truncate |
---|---|---|
说明 | 使用delete删除表格,再使用rollback回滚 此时表格并没有被删除 | 使用truncate删除表格,再使用rollback回滚 此时表格被删除 |
边栏推荐
猜你喜欢
手把手教你如何自制目标检测框架(从理论到实现)
使用pipreqs导出项目所需的requirements.txt(而非整个环境)
"Swordsman Offer" brush questions print from 1 to the largest n digits
Evaluate: A detailed introduction to the introduction of huggingface evaluation indicator module
Using pipreqs export requirements needed for the project. TXT (rather than the whole environment)
积分商城系统设计
Batch PNG format can be converted to JPG format
AI mid-stage sequence labeling task: three data set construction process records
SQL每日一练(牛客新题库)——第5天:高级查询
NFT到底有哪些实际用途?
随机推荐
Path Prefixes (倍增!树上の二分)
Eject stubborn hard drives with diskpart's offline command
编程踩坑合集
MySQL1
0day_Topsec上网行为管理RCE
ArcEngine (six) use the tool tool to realize the zoom in, zoom out and translation of the pull box
用diskpart的offline命令弹出顽固硬盘
【LeetCode】226.翻转二叉树
行业 SaaS 微服务稳定性保障实战
C# 一周入门高级编程之《C#-接口》Day Two
WPF 学习笔记《WPF样式基础》
二进制日志过期时间设置expire_logs_days
What are pseudo-classes and pseudo-elements?The difference between pseudo-classes and pseudo-elements
ArcEngine(三)通过MapControl控件实现放大缩小全图漫游
Redis的基础与django使用redis
greenplum role /user 管理
【LeetCode】112.路径总和
uniapp swiper 卡片轮播 修改指示点样式效果demo(整理)
sqlite 日期字段加一天
redis键值出现 xacxedx00x05tx00&的解决方法