ACID原则:
了解Mysql事务隔离机制首先需要理解什么是ACID:
- A : 原子性automicity,一个事务作为不可分割的最小单元,一个事务里面的所有操作要么全部成功,要么全部失败。
- C:一致性consistency,事物结束后系统状态是一致的,即 数据不能平白无故的产生,也不能平白无故的消失,例如一个转账业务事务,最终所有账户余额不变。
- I:隔离性isolation,简单的讲,一个事务所有的操作,在最后Commit 之前,所有修改对其他事务不可见
- D:持久性durability,当事务提交后,数据应该永久被保存到数据中,即使发生了灾难性后果,数据也不会丢失
Mysql数据库隔离级别:
在实际的运用情况下实现ACID是非常困难的,而且性能上也会大打折扣,很多时候不同的业务对事务的要求不一样,所以为了提升性能并满足业务,数据库提供了4种不同的隔离级别来供用户选择
- 未提交读(Read UNCOMMITTED): 这种级别,当一个事务对数据进行修改后,即使没有提交,也会被其他事务读取到,高并发状态下极易产生脏读。
- 已提交读(READ COMMITTED):在一个事务的整个操作过程中,所有的数据修改对其他事务不可见,但这种情况下会导致其他事务中产生不可重复读(即两次读取结果不一致),这个级别也叫作不可重复读
- 可重复读(REPEATABLE READ):Mysql的默认事务隔离级别,该级别可以保证一个事务在整个流程中,多次读取同样记录的结果相同,但是没有解决幻读的问题。
- 可串行化(SERIALIZABLE): 是事务最高隔离级别,对同一张表的所有的读写都会阻塞,每次都需要获取表级共享锁
多个事务下数据产生的问题有哪些:
- 脏读: 事务A读取到另一个事务B未提交的修改,事务B回滚修改,那么事务A就读取了脏读。
- 不可重复读: 事务A读取记录C,在这个过程中事务B将记录C修改中字段进行修改,那么当事务A再次读取记录C时,获取到的结果与第一次不同,叫做不可重复读。
- 幻读:幻读于不可重复读类似,当事务A第一次读取某个范围记录后,事务B新增了一条记录,事务A在此读取这个范围是会多一条记录导致幻读出现
不同事务隔离级别分别解决什么问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(Read UNCOMMITTED) | 存在 | 存在 | 存在 |
已提交读(READ COMMITTED) | 不存在 | 存在 | 存在 |
可重复读(REPEATABLE READ) | 不存在 | 不存在 | 存在 |
可串行化(SERIALIZABLE) | 不存在 | 不存在 | 不存在 |
Mysql事务常用命令:
有兴趣的同学可以打开几个Sql命令界面,试一下上面的场景,以下是一些常用的事务处理sql:
SELECT @@tx_isolation; -- 查询当前隔离机制
begin; -- 开始事务
rollback; -- 回滚
commit; -- 提交
-- 设置当前会话隔离级别
set session transaction isolation level read uncommitted; -- 未提交读
set session transaction isolation level read committed; -- 已提交读
set session transaction isolation level repeatable read; -- 可重复读
set session transaction isolation level serializable; -- 可串行化
-- 设置系统隔离级别
set global transaction isolation level read uncommitted; -- 未提交读
set global transaction isolation level read committed; -- 已提交读
set global transaction isolation level repeatable read; -- 可重复读
set global transaction isolation level serializable; -- 可串行化
以上仅为博主的粗浅认识,大家有更好的建议请留言,博主会及时更正!!!