一、事务的概述
1.1 概念
保证事务中的所有操作都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
1.2 事务的原理
事务开启之后,所有的操作都会临时保存到事务日志,事务日志只有在得到commit命令才会同步到数据库表中,其他任何情况都会清空事务日志(rollback,断开连接)。
1.3 事务的使用场景
如果在某个业务中需要执行多条SQL语句,这种情况一般是需要使用到事务,从而保证多条SQL语句执行同时成功或同时失败。
例如:转账、批量删除、从购物车中提交订单等等操作。
1.4 事务的四大特性(ACID)
1. 原子性
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
二、MySQL进行事务管理操作
2.1 自动事务(MySQL默认)
MySQL默认是自动提交事务的,一条SQL语句就是一个事务。
2.2 开启事务
2.2.1 方式一:手动开启事务
START TRANSACTION
手动开启事务之后,执行的SQL语句都不会真正改变数据库中的数据,需要用户手动提交事务才能够真正执行SQL语句。
2.2.2 方式二:设置MySQL中的自动提交参数
- 1、查看MySQL中事务是否自动提交
show variables like '%commit%'
- 2、设置自动提交的参数为OFF
set autocommit = 0
2.2.3 提交和回滚事务
1、提交事务
当事务中的SQL语句执行完毕之后,没有出现任何问题,我们需要在最后提交事务,让这些SQL语句真正执行去改变数据库中的数据。
commit
2、回滚事务
当执行这个事务中的SQL语句的过程中,一旦出现问题或者异常,则需要回滚事务,从而回到SQL语句执行之前的状态。
rollback
三、事务的隔离级别
3.1 不考虑事务的隔离性会引发的问题
事务在操作时的理想状态如下:
所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题。
并发访问的问题 | 含义 |
脏读 | 一个事务读取到了另一个事务中尚未提交的数据 |
不可重复读 | 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务update时引发的问题 |
幻读 | 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题 |
3.2 事务隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle |
3 | 可重复度 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 | 最高的隔离级别 |
隔离级别越高,性能(效率)越差,安全性越高。
3.2.1 设置隔离级别
- 设置事务隔离级别
set session transaction isolation level 隔离级别;
- 查询当前事务隔离级别
select @@tx_isolation
学海无涯苦作舟