内容正文:
(中职)MySQL 8.0数据库管理与应用第7章教学课件(工信版)
第7章 事务与锁定
2
7.1.1 事务概述
事务是指作为单个逻辑工作单元执行的一个或多个SQL语句。如果某一事务成功,则在该事务中进行的所有数据更改都会提交并成为数据库中的永久组成部分;如果事务遇到错误而且撤销或回滚,则所有数据更改都会被清除。
一个逻辑工作单元必须有4个属性,称为原子性、一致性、隔离性和持久性(ACID)属性,只有这样才能成为一个事务。
1. 原子性(A)
事务必须是原子工作单元,整个事务中的所有操作,要么全部执行,要么全部都不执行,不可能停滞在某个中间环节。如果事务在执行过程中发生错误,会被返回到事务开始前的状态,就像这个事务从来没有执行过一样。
2. 一致性(C)
当事务完成时,必须使所有的数据都保持一致状态。
3. 隔离性(I)
由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
4. 持久性(D)
完成完全持久的事务之后,它的影响将永久存在于系统中。
7.1 事务
7.1.2 设置自动提交模式
默认情况下,MySQL是在启用自动提交模式的情况下运行的。
使用SET autocommit语句来禁用或启用当前会话的默认自动提交模式:
SET autocommit={0 | 1}
如果将系统变量autocommit设置为1,则对表的所有更改都会立即生效。如果将该变量设置为0,则禁用自动提交模式。
变量autocommit是一个会话变量,必须对每个会话进行设置。默认情况下,客户端连接将以autocommit设置为1开始。如果要对每个新连接禁用自动提交模式,则需要对全局自动提交值进行设置。
使用--autocommit=0选项启动MySQL服务器:
mysqld --autocommit=0
使用MySQL配置文件设置全局变量:
[mysqld]
autocommit=0
7.1 事务
7.1.3 开始事务
使用START TRANSACTION语句将使自动提交模式保持禁用状态,一直到使用COMMIT或ROLLBACK语句结束事务,自动提交模式恢复为先前的状态,语法格式如下。
START TRANSACTION
[事务特征[, 事务特征] ...]
事务特征:
{WITH CONSISTENT SNAPSHOT
| READ WRITE | READ ONLY}
以BEGIN和BEGIN WORK作为START TRANSACTION的别名来启动事务:
BEGIN [WORK]
7.1 事务
7.1.4 提交事务
使用COMMIT语句可以提交当前事务,使其更改成为永久更改,语法格式如下。
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
COMMIT语句支持可选的WORK关键字,也支持CHAIN和RELEASE子句。CHAIN和RELEASE子句可以用于对事务完成的附加控制。
AND CHAIN子句导致新事务在当前事务结束后立即开始,并且新事务与刚刚终止的事务具有相同的隔离级别。新事务还使用与刚刚终止的事务相同的访问模式(READ WRITE或READ ONLY)。
RELEASE子句使服务器在终止当前事务后断开当前客户端会话。使用NO关键字可以禁止CHAIN或RELEASE完成。
如果系统变量completion_type默认设置为CHAIN或RELEASE完成,则NO选项是很有用的。
7.1 事务
7.1.5 回滚事务
使用ROLLBACK语句可以回滚当前事务,撤消其更改,语法格式如下。
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK语句支持可选的WORK关键字,也支持CHAIN和RELEASE子句。CHAIN和RELEASE子句可以用于对事务完成的附加控制,请参阅COMMIT语句中的说明。
某些语句是无法回滚的。这些语句包括数据定义语言(DDL)语句,例如创建或删除数据库的语句,创建、删除或更改表或存储例程的语句。应该将事务设计为不包括这一类语句。如果在无法回滚的事务的早期发出语句,而以后出现另一个语句失败,则在这种情况下无法通过发出ROLLBACK语句来回滚事务的完整效果。
回滚的事务不会被记录。对非事务性表的修改是无法回滚的。如果回滚的事务包括对非事务性表的修改,则在末尾使用ROLLBACK语句记录整个事务,以确保复制对非事务性表的修改。
7.1 事务
7.1.6 事务保存点
1. 设置事务保存点
SAVEPOINT 保存点名称
如果当前事务具有相同名称的保存点,则删除旧保存点并设置新保存点。
2. 回滚到事务保存点
ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称
设