MySQL事务

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特性与其四个隔离级别。

版权声明

装载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值