My SQL中事务那点事
- 1.定义
- 2.操作
- 3.提交方式
- 4.事务特征(ACID)
- 5.事务的隔离级别
- 5.1 定义
- 5.2 产生问题
- 5.3 隔离级别
1.定义
也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。
2.操作
- 开启事务: start transaction;
- 回滚:rollback;
- 提交:commit;
3.提交方式
- 自动提交
当我们进行DML(增删改)操作后,mysql默认进行自动提交,我们无需commit;来提交。 - 手动提交
这需要我们先开启事务后(START TRANSACTION;
),然后执行SQL语句,最后进行提交(commit;
)。可以查看事务的提交方式:
SELECT @@autocommit;
设置事务手动提交方式:set @@autocommit = 0;
默认自动提交:@@autocommit = 1;
4.事务特征(ACID)
- 原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。 - 一致性(Consistency)
事务使得系统从一个一致的状态转换到另一个一致状态,不论事务的成功还是失败,整个系统处于数据一致的状态。 - 隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。 - 持久性(Durability)
也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
5.事务的隔离级别
5.1 定义
多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
5.2 产生问题
- 脏读
一个事务,读取到另一个事务中没有提交的数据
- 不可重复读
在同一个事务中,两次读取到的数据不一样
简单来说:
两个事务都进行了开启,事务①首先进行了select,读出一些数据,然后事务②进行DML操作,已提交,这时事务①再次进行select数据,发现在事务①中,两次提交的数据不一致。 - 幻读
由于mysql不能进行操作实现,大家可能对其理解为两次读取获取的结果集不同,其实更加侧重某一次的的select查询得到的结果无法支撑后续的业务操作。
简单来说:
当小王准备去数据库添加一条id为999的数据,他首先应该查询该数据是否存在,经查询不存在,于是他就开始进行插入数据,但是数据已经存在了,无法实现插入的操作,一脸**的小王感觉怀疑人生了,这就发生了幻读。
5.3 隔离级别
隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
读未提交 (read uncommitted) | 未解决 | 未解决 | 未解决 |
读已提交(read committed) | 解决 | 未解决 | 未解决 |
可重复读 (repeatable read) | 解决 | 解决 | 未解决 |
可串行化 (serializable) | 解决 | 解决 | 解决 |
注意:隔离级别从小到大安全性越来越高,但是效率越来越低