MySQL InnoDB事务与锁

2020-01-11  本文已影响0人  代码的搬运工

1、事务简介

事务是由一组SQL语句组成的逻辑处理单元。

2、事务的ACID原则

(一)A (Atomicity) 原子性

事务里的所有操作要么全部做完,要么全部不做。

注:Redo Log机制保证事务原子性。

(二)C (Consistency) 一致性

事务完成,该调整的数据都调整,事务失败,该调整的数据都不调整。

注:Undo Log机制保证事务一致性。

(三)I (Isolation) 隔离性

并发的事务之间不会互相影响。

注:锁机制保证事务独立性。

(四)D (Durability) 持久性

事务完成后所做数据修改都会永久保存在数据库里。

注:Redo Log机制保证事务持久性。

3、事务的并发问题

(一)更新丢失

两个事务对同一条记录做修改,后面的事务会覆盖掉前面的事务的数据。

(二)脏读

 一个事务读取到了另一个事务还没有提交的数据。

(三)不可重复读

一个事务读取某条记录两遍,之间有另一个事务对该记录做了修改,导致两次读取的数据不一样。

(四)幻读

一个事务读取记录列表两遍,之间有另一个事务对列表插入了数据,导致两次读取的数据不一样。

4、事务的隔离级别

(一)未提交读

在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。

(二)已提交读

在一个事务中,可以读取到其他事务已提交的数据变化,这种读取也就做不可重复读,因为两次同样的查询可能会得到不一样的结果。

(三)可重复读

MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读的问题。

(四)可串行化

这是最高的隔离级别,它强制事务串行执行,避免前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。

5、锁机制

(一)乐观锁

乐观锁思想认为:一个事务读取数据的同时别的事务不会更新数据,更新数据的同时别的事务可能会更新数据。更新数据时需要对数据进行冲突验证,当发生冲突的时候,返回错误信息,让用户决定如何去做。乐观锁不会使用数据库提供的锁机制,一般的实现方式就是记录数据版本号。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

(二)悲观锁

悲观锁思想认为:一个事务读取或更新数据的同时别的事务必定会更新数据。在读取或更新数据之前借助于数据库锁机制,先对数据进行加锁处理。在效率方面,处理锁的操作会产生额外的开销,而且增加了死锁的机会。当一个线程在处理某行数据的时候,其他线程只能等待。共享锁和排他锁都属于悲观锁。

(三)共享锁(读锁)

一个事务读取数据的同时别的事务可以读取数据,但是不能更新数据。

(四)排他锁(写锁)

一个事务更新数据的同时别的事务不能读取数据也不能更新数据。

(五)间隙锁

间隙锁的唯一作用就是防止其它事务的插入操作,以此来达到防止幻读的发生,所以间隙锁不分什么共享锁与排它锁

上一篇下一篇

猜你喜欢

热点阅读