MySQL事务

93 阅读3分钟

一、事务概念

事务(Transaction),是我们关系型数据库中非常重要的一个概念,它要符合ACID特性。是由一组SQL语句组成的一个程序执行单元(Unit),该执行单元要么成功Commit,要么失败Rollback。

二、事务的四个特性

ACID特性

Atomicity(原子性)

Consistency(一致性)

Isolation(隔离性)

Durability(持久性)

mp.weixin.qq.com/s?__biz=MzI…

三、事务的隔离级别

在并发事务没有进行隔离的情况下,会发生如下问题。

  • 问题一:脏读 脏读指一个事务读取了另外一个事务未提交的数据。

  • 问题二:不可重复读 不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。 不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。

  • 问题三:幻读(虚读) 幻读(虚读)指在一个事务内读取到了别的事务插入的数据,导致前后读取条数不一样。

事务的隔离级别分为:

  • Read uncommitted(读未提交)
  • Read Committed(读已提交)
  • Repeatable Reads(可重复读)
  • Serializable(串行化)

GLOBAL:设置全局的事务隔离级别 SESSION:设置当前session的事务隔离级别,如果语句没有指定GLOBAL或SESSION,默认值为SESSION

mysql默认级别:Repeatable Read(可重复读)

PS: 在实际开发过程中,这样的加锁行为(使用事务隔离级别时,所引申出来的根本问题就是可以通过锁机制解决),是非常的耗系统性能的。下一章节我们将来介绍悲观锁与乐观锁

juejin.cn/post/684490…

四、悲观锁与乐观锁

定义

悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

乐观锁机制采取了更加宽松的加锁机制。乐观锁是相对悲观锁而言,也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性。

实现乐观锁一般来说有以下2种方式:

  • 使用版本号 使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。
  • 使用时间戳 乐观锁定的第二种实现方式和第一种差不多

适用场景

悲观锁

比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

乐观锁

比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

mp.weixin.qq.com/s/zUIS-FDxZ…

五、行锁、表锁、死锁