MySQL事务

一、什么是事务

MySQL事务是一组SQL操作,比如转账场景中,查询余额、增加减少余额、更新余额,这三步操作必须是一体的,这些操作作为一个独立的单元来执行,要么全部执行成功,要么全部执行失败,不存在部分成功部分失败,有效的保证了数据的完整性和一致性。在MySQL中,事务支持是在存储引擎实现的,比如常用的存储引擎InnoDB,这也是我们选择InnoDB的原因之一。

二、隔离性与隔离级别

MySQL的事务,遵循ACID(Atomicity、Consistency、Isolation、Durability),即原子性、一致性、隔离性和持久性

  • 原子性:事务是一组SQL操作,原子性就是把这一组SQL当成最小的执行单元,要么全部成功,要么全部失败,如果这一组SQL中有任何一条SQL执行失败,那么这组SQL就全部失败,整个事务将会被回滚(所有数据恢复到执行事务之前的状态)。
  • 一致性:数据库不会违反任何事先定义的规则和约束,数据一直处于一中可接收状态,在事务执行前后不会改变数据库的状态。
  • 隔离性:多个事务可以并发执行,但是每个事务都是独立的,彼此之间互不干扰。
  • 持久性:一旦事务提交,对数据库的改变将是永久性的。

这是ACID的概念,那么隔离级别又是怎么来的呢?

当数据库上有多个事务并发执行的时候,就有可能出现脏读、不可重复读、幻读等问题,为了解决这些问题,就有了“隔离级别”的概念。好了,这里来了三个陌生词,我来解释一下:

  • 脏读:当一条数据已经被修改,但是这个事务1还未提交时,另一个事务2进来读到了这条已修改的数据,而后事务1因为某种原因归滚,这时候就读到了一条不存在的“脏”数据。
  • 不可重复读:同一个事务内,多次读取同一条数据时发现值不一样,期间可能发生了修改,就是不可重复读。
  • 幻读:幻读与不可重复度相似,是指在同一个事务内,两次读取的行数不同(注意这里时行数,不可重复读是同一条数据),在两次读取之间,数据库可能发生了增加或者删除操作。

正因为有了问题,就有了隔离级别的出现,用于解决不同的问题。事务级别一共有四种,事务的隔离级别越高,执行效率就会越低,所以我们要根据实际的情况来选择,四种隔离级别分别是读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)、串行化(serializable)。我来解释一下这四个概念:

  • 读未提交:一个事务还没有提交时,别的事务就可以看到它更改后的数据,解决不了任何问题,会出现脏读、不可重复读、幻读的问题
  • 读提交:一个事务只有在提交后,别的事务才能看到它修改后的数据,解决了脏读的问题,还是很会出现不可重复读和幻读的问题
  • 可重复读:一个事务执行过程中读到的数据,总是跟这个事务启动时看到的数据是一致的。未提交事务的变更对其他事务是不可见的。解决了脏读和不可重复读问题。
  • 串行化:这个类似与Java中的锁,对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读锁和写锁冲突的时候,后面访问的事务必须等前一个事务执行完成才能继续进行,最高的隔离级别,解决了脏读、不可重复读、幻读的问题,但是执行效率是最低的。

InnoDB默认的隔离级别时可重复读

三、事务隔离的实现

数据库实现事务隔离主要用的是锁机制和多版本并发控制(MVCC)

锁机制:数据库可以使用行级锁来实现事务隔离,在事务访问或修改数据时,只锁定所需的行

表级锁:数据库使用表级锁来锁定整个表,确保事务的完全隔离,不过会影响性能,表级锁限制了并发性

多版本并发控制(MVCC):MVCC通常用于读写操作,它使用版本号或时间戳来跟踪每个数据行的状态,以便事务可以访问之前的版本,而不会干扰其他事务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值