简述
Transaction Control Language 事务控制语言
事务:事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
存储引擎
- 概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中
- 通过
show engines
命令来查看 MySQL 支持的存储引擎
- 在 MySQL 中用的最多的存储引擎有:innodb,myisam,memory 等。其中 innodb 支持事务,而 myisam、memory 等不支持事务
ACID 属性
- 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 - 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 - 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 - 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,数据将持久化到本地,除非其他事务对其进行修改。
事务的分类
隐式事务
- 没有明显的开启和结束事务的标志
- DB 自动提交功能默认开启
- 比如 insert、update、delete 语句本身就是一个事务
显式事务
- 具有明显的开启和结束事务的标志
- 开启事务 → 编写事务的一组逻辑操作单元 → 提交事务 | 回滚事务
SET AUTOCOMMIT = 0; START TRANSACTION; ... COMMIT / ROLLBACK;
事务通常以 START TRANSACTION 开始(如果 SET AUTOCOMMIT = 0,START TRANSACTION 则可省略)。以 COMMIT 或 ROLLBACK 结束。COMMIT 表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。ROLLBACK 表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。这里的操作指对数据库的更新操作。
隔离级别
- 事务并发问题如何发生? 当多个事务同时操作同一个数据库的相同数据时
- 事务的并发问题有哪些?
- 【脏读】对于两个事务 T1、T2,T1 读取了已经被 T2 更新但还没有被提交的字段。之后,若 T2 回滚,T1 读取的内容就是临时且无效的
- 【不可重复读】对于两个事务T1、T2,T1 读取了一个字段,然后 T2 更新了该字段。之后, T1再次读取同一个字段,值就不同了
- 【幻读】 对于两个事务T1、T2,T1 从一个表中读取了一个字段,然后 T2 在该表中插入了一些新的行。之后, 如果 T1 再次读取同一个表,就会多出几行
- 如何避免事务的并发问题?
- 通过设置事务的隔离级别, 一个事务与其他事务隔离的程度称为 "隔离级别"。
- 数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
- 通过设置事务的隔离级别, 一个事务与其他事务隔离的程度称为 "隔离级别"。
- Oracle 支持的 2 种事务隔离级别:READ COMMITED,SERIALIZABLE。Oracle 默认的事务隔离级别为:READ COMMITED
- MySQL 支持 4 种事务隔离级别。MySQL 默认的事务隔离级别为:REPEATABLE READ
- 每启动一个 MySQL 程序, 就会获得一个单独的数据库连接。每个数据库连接都有一个全局变量
@@tx_isolation
,表示当前的事务隔离级别。 - 相关命令
- 查看当前的隔离级别:
SELECT @@tx_isolation;
- 设置当前 MySQL 连接的隔离级别:
set transaction isolation level ???;
- 设置数据库系统的全局的隔离级别:
set global transaction isolation level ???;
- 查看当前的隔离级别:
回滚点
SAVEPOINT 断点
COMMIT TO 断点
ROLLBACK TO 断点
delete & truncate
- DELETE 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
- TRUNCATE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。