MySQL视频笔记—事务的隔离级与锁

极客学院

1.事务隔离级别

MySQL事务隔离可以查看文章:
https://www.cnblogs.com/huanongying/p/7021555.html

事务隔离级别:

  • SERIALIZABLE(序列化)
  • REPEATABLE READ(可重复读)
  • READ COMMIT(提交读)
  • READ UNCOMMIT(未提交读)

要了解MySQL的隔离级别,首先要了解MySQL事务的并发问题:

  • 1.脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
  • 2.不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。
  • 3.幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级后,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

总结:不可重复读的和幻读很任意混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

MySQL事务隔离级别:

这里写图片描述

锁、时间戳、乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采样的技术手段。

# 1.查看当前会话隔离级别
select @@tx_isolation;

# 2.查看系统当前隔离级别
select @@global.tx_isolation;

# 3.设置当前会话隔离级别
set session transaction isolation level repeatable read;

4.设置系统当前隔离级别
set global transaction isolation level repeatable read;

2.MySQL性能与非事务表的表锁定

读锁(共享锁):是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

如果事务T对数据A加上共享锁,则其他事务只能对A再加共享锁,不能加排他锁。获取共享锁的事务只能读数据,不能修改数据。

写锁(排他锁):如果事务T对数据A加上排他锁后,则其他事务不能对A加任何类型的封锁。获取排他锁的事务既能读数据,又能修改数据。

事务可以通过以下语句给sql加共享锁和排他锁:

共享锁:select ...... lock in share mode;
排他锁:select ...... for update;

支持事务的数据库在保持不同用户彼此隔离方面要比非事务数据库复杂,因此自然反映在系统的性能上面。

在使用事务表时,提高性能的一些方法:

  • 使用小事务
  • 选择合适的隔离级别
  • 保证开始事务前一切都是可行的
  • 避免死锁

MySQL锁详解:

数据库锁机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。

MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。

表级锁定:

表级别的锁定时MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点时实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。

当然,锁定颗粒度大所带来的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。使用表级锁定的主要时MyISAM,MEMORY,CSV等一些非事务性存储引擎。

行级锁定:

行级索定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用程序的整体性能。

虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗也就更大了。此外,行级锁定也最容易发生死锁。使用行级锁定的主要是InnoDB存储引擎。

页级锁定:

行级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。
页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供并发处理能力也同样介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减少,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇见锁等待的可能性也会随之降低,系统整体并发度也随之提升。

使用页级锁定的主要是BerkeleyDB存储索引。

总的来说,MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

详细可以参考:https://www.cnblogs.com/luyucheng/p/6297752.html

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/80558897
今日推荐