MySQL事务隔离

MYSQL事务隔离

事务

在MySQL中,事务是针对数据库进行的一组操作,由一条或多条语句组成,每个SQL语句都是相互依赖的,只要在程序执行过程中有一条语句执行失败或发生错误,则其他语句都不会执行 通过回滚撤销已经执行的SQL语句

事务的特性

  • 原子性
    一个事务必须被视为一个不可分割的最小工作单元,对一个事务来说只存在两种结果:所有SQL语句执行成功或所有SQL语句撤销回到执行前状态
  • 一致性
    一致性是指在事务处理时,不管成功还是失败,数据库系统不会返回到一个未处理的事务中,MySQL的一致性由日志机制实现
  • 隔离性
    隔离性是指一个事务在执行时,不会受到其他事务的影响,保证未完成事务的所有操作与数据库系统的隔离,直到事务完成为止才能看到事务的执行结果
  • 持久性
    事务一旦提交,对数据库的修改就是永久性的 除硬盘损坏等外部原因

事务隔离级别

由于数据库是一个多用户共享的资源,MySQL允许多线程并发访问,因此用户可以通过不同的线程执行不同的事务,为了保证这些事务之间不受影响,需要设置事务的隔离级别

MySQL中事务隔离级别有四种,按隔离级别由低到高为:

  • READ UNCOMMITTED 读取未提交
    在这个级别下的事务可以读取到其他事务中未提交的数据,这种读取方式也叫做脏读
    例如,买家A下单后未付款(数据未提交),而卖家B这时读取了下单信息,认为A转了货款,于是发货,而A将事务回滚,撤回订单,最终造成B损失了货物
  • READ COMMITTED 读取提交
    在这个隔离级别下,事务可以读到其他事务已经提交的数据,避免脏读,但由于其他事务可能存在UPDATE操作,当前事务不同时间读取到的数据不同,也叫不可重复读
  • REPEATABLE READ 重复读
    在这个隔离级别下,事务读取到的其他事务已提交数据是可重复的,即每次读取到的数据一致,这是因为在这个级别下不允许其他事务的UPDATE操作
    虽然可以禁止其他事务的UPDATE操作,但无法禁止另一个新事务对目标事务的INSERT操作,即读取过程中数据仍然可能是变化的,这种读取方式也被称为幻读
  • SERIALIZABLE 可串行化
    最高的隔离级别,在每个读取的数据行上加锁,解决了脏读、不可重复读和幻读的问题,但加锁导致事务串行化执行,违背了并发思想,效率低下,一般很少使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值