内容正文:
第13章 事务和并发控制
主要内容
13.1 事务
13.2 并发控制
13.3 本章小结
13.1 事务
用户在执行某些复杂数据操作的过程中,经常需要通过一组有相互依赖关系的SQL语句,来执行多项并行业务逻辑或者程序,这就要求所有命令执行的同步性。
我们把这些有相互依赖关系的SQL语句称之为单元,整个单元作为一个整体是不可分割的,单元中的所有SQL语句要么同时操作成功,要么同时返回初始状态。在这种情况下,用户就需要优先考虑使用MySQL的事务处理。
13.1 事务
13.1.1 事务的概念
MySQL中的事务通常包含一系列更新操作(UPDATE、INSERT和DELETE等操作语句),这些更新操作是一个不可分割的逻辑工作单元,用来保证对数据库的正确修改和保持数据的完整性、一致性。
如果事务成功执行,那么该事务中所有更新操作都会成功执行,并将执行结果提交到数据库文件中,成为数据库永久的组成部分。如果事务中某个更新操作执行失败,那么事务中的所有更新操作均被撤销,所有影响到的数据将返回到事务开始之前的状态。
在数据库管理系统中,事务管理是非常有必要的,它是构成多用户使用数据库的基础。
13.1 事务
13.1.2 事务的ACID特性
每个事务的处理必须满足ACID原则,即原子性(A)、一致性(C)、隔离性(I)和持久性(D),我们称之为事务的特性或特征。
原子性(Atomicity):每个事务中的所有操作都被视为一个原子单元,对事务所进行的数据修改等操作只能是完全提交或者完全回滚。
一致性(C):所有的数据从一种一致性状态变更为另外一种一致性状态。
隔离性(I):每个事务中的操作语句所做的修改必须和其他事务所做的修改相隔离,而且事务的结果只有在它完全被执行时才能看到。
持久性(D):即使系统重启或者出现故障系统崩溃,一个提交的事务依然存在。
13.1 事务
13.1.3 MySQL的事务的处理语句
MySQL默认使用自动提交模式,即当一个会话开始时,自动提交功能是打开的,用户每执行一条SQL语句后,该语句对数据库的修改就被立即提交,永久保存在数据库里。
默认情况下,会话变量autocommit的值为ON,每个SQL语句都被当作一个事务执行提交操作。
【例13.1】查看会话变量autocommit。
在MySQL命令行客户端输入命令:
SHOW VARIABLES LIKE 'autocommit’;
SELECT @@autocommit;
13.1 事务
13.1.3 MySQL的事务的处理语句
在MySQL中,有两种方式可以关闭自动提交功能。
显式关闭自动提交功能
在当前会话中,使用SET语句修改会话变量autocommit的值来关闭当前会话的自动提交功能。
SET autocommit = 0;
隐式关闭自动提交功能
我们可以使用START TRANSACTION语句或者BEGIN [work]语句来显式地开启一个事务,这就意味着在该事务中关闭了自动提交功能。START TRANSACTION是标准的SQL语法格式,是MySQL官方推荐的开启事务的方法。
13.1 事务
13.1.3 MySQL的事务的处理语句
当事务中的SQL语句执行完毕,我们必须通过COMMIT语句来提交整个事务,或者通过ROLLBACK语句来回滚到事务开始之前的状态。
我们还可以在事务中使用SAVEPOINT point语句来设置一个保存点,也叫回退点,然后用ROLLBACK TO SAVEPOINT point语句回滚到保存点位置,从而达到部分语句回滚的目的。
13.1 事务
13.1.3 MySQL的事务的处理语句
【例13.2】演示事务中的部分回滚操作。
在MySQL命令行客户端输入命令:
START TRANSACTION;
INSERT INTO course_available VALUES('101','高等数学',30,70);
SAVEPOINT savei;
DELETE FROM course_available WHERE cname='宪法学';
ROLLBACK TO SAVEPOINT savei;
13.1 事务
13.1.4 MySQL的事务的隔离级别
每一个事务都有所谓的隔离级别,它定义了用户彼此之间隔离和交互的程度。
使用SET TRANSACITON语句可以设置事务的特征,包括设置事务隔离级别或者事务访问模式。语法格式:
SET [GLOBAL|SESSION] TRANSACTION
{ ISOLATION LEVEL level | access_mode}
13.1 事务
13.1.4 MySQL的事务的隔离级