事务隔离级别
引言:在介绍事务隔离级别前,先回顾下事务。
MYSQL TCL(事务控制语言)
事务
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或者错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始前的状态,如果单元中的所有sql语句均执行成功,则事务被顺利进行。
事务的特性(ACID)
- 原子性:原子性事务中的操作为一个整体,要么都做,要么都不做.即一旦事务出错,就回滚事务
- 一致性:执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
- 隔离性:一个事务的执行不能被其他事务干扰。即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事物之间不能互相干扰
- 持久性:指一个事物一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响
事务的创建
- 隐式事务:事务没有明显的开始和结束的标记
比如insert、update、delete语句
DELETE FROM 表 WHERE id = 1;
- 显示事务:事务具有明显的开启和结束标记
前提:必须设置自动提交功能为禁用
#设置自动提交功能为禁用
SET AUTOCOMMIT=0
START transaction;#可选中的,开启事务
#编写事务中的sql语句(select、insert、update、delete)
语句1:
语句2:
#结束事务
commit: #提交事务
rollback: #回滚事务
savepoint 节点名: #设置保存点
事务隔离性问题
对于同时运行的多个事务,当这些事务访问数据库中的同一个事务时,如果没有采用有效的隔离机制,那么可能会导致各种并发问题。
并发问题有哪些呢?(隔离性问题)
- 脏读:简单来说,就是一个事务在处理过程中读取了另外一个事务未提交的数据。
- 不可重复读:是指一个事务范围内,多次查询某个数据,却得到不同的结果。
- 幻读:在一个事务过程中,用同样的操作查询数据,得到的记录数不相同
小结:
- 脏读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同)
- 不可重复读和幻读区别 :不可重复读的一般针对的是行级别的数据的更改,重点是修改了数据;幻读一般针对表级别的新增/删除数据,在统计事务中,两次读取的数据统计不一样,重点在于新增或者删除。
为了解决事务隔离性的问题,数据库一般会有不同的隔离级别来解决相应的读写影响。
使用事务隔离级别处理以上问题,事务隔离级别有哪些呢?注意:以下()里代表设置的隔离级别未能解决相关的并发问题
- 读未提交:一个事务B还没提交,它的修改就被别的事务A读到了。(脏读、不可重复读、幻读)
- 读已提交:一个事务B提交后,它的修改被其他事务A看到了。(不可重复读、幻读)
- 可重复读:一个事物B提交前和提交后,事务A都无法读到事务B的变更。默认(幻读)
- 串行化:对同一行记录,当出现不同事物的读写冲突时,是通过串行化的方式解决的,后一个事务必须等前一个事务完成才能执行。都可以解决,加锁影响性能