1.事务的概念
事务的概念:
• 上层看起来比较简单的需求,可能对应的后端要做很多工作,后端这些工作组合起来才是一个完整的需求解决的方案。
• 事务由一条或多条SQL语句组成,这些语句在逻辑上存在相关性,共同完成一个任务,事务主要用于处理操作量大,复杂度高的数据。比如转账就涉及多条SQL语句,包括查询余额(select)、在当前账户上减去指定金额(update)、在指定账户上加上对应金额(update)等,将这多条SQL语句打包便构成了一个事务。
• MySQL同一时刻可能存在大量事务,如果不对这些事务加以控制,在执行时就可能会出现问题。比如单个事务内部的某些SQL语句执行失败,或是多个事务同时访问同一份数据导致数据不一致的问题。因此一个完整的事务并不是简单的SQL集合,事务还需要满足如下四个属性:
• 原子性: 一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中如果发生错误,则会自动回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
• 持久性: 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
• 隔离性: 数据库允许多个事务同时访问同一份数据,隔离性可以保证多个事务在并发执行时,不会因为由于交叉执行而导致数据的不一致(事务由多个SQL构成,隔离性是防止多个事务的SQL交替执行而导致的数据不一致问题)。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化( Serializable )。
• 一致性: 在事务开始之前和事务结束以后,数据库的完整型没有被破坏,这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联型以及后续数据库可以自发性地完成预定的工作。
原子性、持久性、隔离性是手段,一致性是目的。一致性其实是仅停留在上层概念上的,也就是说原子性、持久性、隔离性都需要在MySQL内部实现,一致性不需要在MySQL内部实现,只要将原子性、持久性、隔离性这三点在MySQL内部实现了,那么结果就是一致的,也就实现了一致性。
上面的四个属性简称ACID:
• 原子性(Atomicity,又称不可分割性)。
• 一致性(Consistency)。
• 隔离性(Isolation,又称独立性)。
• 持久性(Durability)。注:MySQL要提供事务机制,注定了MySQL内部编码和数据结构的支持。MySQL一定会同时存在多个事务,MySQL要对多个事务进行管理工作,需要先描述再组织,因此事务不要抽象的理解它,事务最终一定是要以某种数据结构+算法管理起来。
为什么会出现事务:
• 事务本身不是数据库类软件天然有的,事务被MySQL编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,不需要用户自己去考虑各种各样的潜在错误和并发问题。
• 如果MySQL只是单纯的提供数据存储服务,那么用户在访问数据库时就需要自行考虑各种潜在问题,包括网络异常、服务器宕机等。因此事务本质是为了应用服务的,而不是伴随着数据库系统天生就有的。
2.事务的版本支持
事务的版本支持:
通过 show engines 命令可以查看数据库引擎。如下:
说明一下:
• Engine: 表示存储引擎的名称。
• Support: 表示服务器对存储引擎的支持级别,YES表示支持,NO表示不支持,DEFAULT表示数据库默认使用的存储引擎,DISABLED表示支持引擎但已将其禁用。
• Comment: 表示存储引擎的简要说明。
• Transactions: 表示存储引擎是否支持事务,可以看到InnoDB存储引擎支持事务,而MyISAM存储引擎不支持事务。
• XA: 表示存储引擎是否支持XA事务。
• Savepoints: 表示存储引擎是否支持保存点。
3.事务的提交方式
查看事务的提交方式:
事务常见的提交方式有两种,分别是自动提交和手动提交。
通过show命令查看autocommit全局变量,可以查看事务的自动提交是否被打开。如下:
说明一下:autocommit的值为ON表示自动提交被打开,值为OFF表示自动提交被关闭,即事务的提交方式为手动提交。
设置事务的提交方式:
通过set命令设置autocommit全局变量的值,可以打开或关闭事务的自动提交。如下:
说明一下:将autocommit的值设置为1表示打开自动提交,设置为0表示关闭自动提交,相当于将事务提交方式设置为手动提交。
4.事务的相关演示
准备测试表:
演示一:事务的常规操作
演示二:原子性
演示三:持久性
演示四:begin会自动更改提交方式
演示五:单条SQL与事务的关系