MySQL事务
本文主要讲述了MySQL事务的四大特性,三种工作模式与四大隔离级别,如有错误,欢迎纠正。
1. 引言
事务(Transaction)是一个最小的不可再分的工作单元,通常一个事务对应一个完整的业务逻辑,比如转账涉及两个账户的余额变化。一个完整的事务需要多个数据操作命令(DML)语句共同完成,并且只和DML有关。
2. 事务四大特性
事务具有四大特性(ACID),分别为:
- 原子性(Atomicity):事务是最小的工作单元,不可分割。事务包含的所有操作要不全部成功,要不就全部回滚;
- 一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致;
- 隔离性(Isolation):两个事务在进行数据操作命令的时候,互不干扰,互相隔离;
- 持久性(Durability):一旦事务执行成功,事务中所有的数据都必须保存到数据库中。
3. 事务三种模式
事务运行具有三种模式,分别为:
- 自动提交事务:如果一条语句执行成功,则自动提交数据到数据库,若遇到错误则回滚(在MySQL中是默认自动提交的模式);
- 显式事务:以begin\start transaction开始,以commit或rollback结束;
- 隐式事务:无需使用begin\start transaction开始,第一次执行sql语句就会开始第一个事务,直到commit或rollback结束。
4. 事务四大隔离
- 第一级别:读取未提交内容(Read Uncommitted)
所有事务都可以看到其它事务未提交的内容,所以这会引起脏读(Dirty Read)现象,即读取未提交的数据。这一级别很少应用到实际应用,因为数据的安全性能太差。 - 第二级别:读取提交内容(Read Committed)
每个事务只能看到别的事务已经提交的内容,这会引发不可重复读(Nonrepeatable Read)现象,即在同一个事务的过程中看到的数据可能是不一样的,因为可能存在别的事物提交了内容。 - 第三级别:可重复读(Repeatable Read)
每个事务在执行过程中只会看到同样的数据,这是MySQL默认的事务隔离等级。这又会引发幻读(Phantom Read)现象,即同一事务下select某个记录时可能不存在,执行insert时发现该记录已经存在,无法插入的现象。出现幻读的原因是因为不同的事物可以同时访问同一内存,这可以通过加锁解决。 - 第四级别:可串行化(Serializable)
每个事务按照先后顺序执行,但是这样会造成运行时间过长,资源的浪费。
5. MySQL操作事务
本人使用的MySQL版本号为8.0.23,所以不能使用@@tx_isolation查看数据库的当前隔离等级,而需要用到:
select @@transaction_isolation;
查看系统的的隔离级别可以使用:
select @@global.transaction_isolation;
修改数据库事务隔离等级可以使用:
set session transaction isolation level <transaction_level>;
- <transaction_level>:四个隔离等级分别对应read uncommitted,read committed,repeatable read与serializable。
6.总结
本文主要讲了MySQL事务中的ACID特性与其四个隔离级别。
版权声明
装载请注明出处。