mysql行锁和表锁

2023年 10月 25日 56.3k 0

1、所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都将无法再向前推进。

2、产生死锁的原因

a.竞争资源

1.可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和内

存均属于可剥夺性资源;

2.另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强行回收,只能在进

程用完后自行释放,如磁带机、打印机等。

3.产生死锁中的竞争资源之一指的是竞争不可剥夺资源

4.产生死锁中的竞争资源另外一种资源指的是竞争临时资源,通常消息通信顺序进行不当,则会

产生死锁

b.进程间推进顺序非法

1.若P1保持了资源R1,P2保持了资源R2,系统处于不安全状态,因为这两个进程再向前推进,

便可能发生死锁

2.例如:当P1运行到P1:Request(R2)时,将因R2已被P2占用而阻塞;当P2运行到

P2:Requesr(R1)时,也将因R1已被P1占用而阻塞,于是发生进程死锁

死锁产生的4个必要条件

1.互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一进程占用

2.请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放

3.不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放

4.环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链

解决死锁的基本方法

预防死锁:

避免死锁:

检测死锁:

解除死锁:

1:什么是锁

用于多用户环境下保证数据库完整性和一致性。

2:锁的模式

共享锁(S锁)

用于读取数据。拥有共享锁的资源不能被修改。

排他锁(X锁)

用于数据修改。与其他任何锁都不兼容。

更新锁(U锁)

用于读取和修改。与S锁兼容,不影响读取;与U锁不兼容,避免死锁

mysql常用引擎有MyISAM和InnoDB,而innodb是mysql默认的引擎。myisam不支持行锁,而innodb支持行锁和表锁,相对其他数据库而言,mysql的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。

mysql大致可以归纳为以下3种锁:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定力度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间,会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

行锁:在mysql的innodb引擎支持行锁,与oracle不同,Mysql的行锁是通过索引加载的,也就是说,行锁是加在索引响应的行上的,要是对应的sql语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表锁,此时其他事务无法对当前表进行更新或插入操作。

for update:如果一条语句后加上for update,则查询到的数据会被加上一条排它锁,其他事务可以读取,但不能进行更新和插入操作

行锁的实现需要注意:

行锁必须有索引才能实现,否则会自动锁全表,那么久不是行锁了。

两个事务不能锁同一个索引。

insert,delete,update在事务中都会自动默认加上排它锁。

建议:

尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。

合理设计索引,尽量缩小锁的范围

尽可能减少索引条件,避免间隙锁

尽量控制事务大小,减少锁定资源量和时间长度。

mysql默认表

mysql:该库是mysql核心库,该库下的表主要存储数据库用户、权限等mysql自身

1.mysql的设计者到现在为止设计了4种不同类型的行格式,分别是COMPACT,REDUNDANT,DYNAMIC,和COMPRESSED

页是innodb中磁盘和内存交互的基本单位,也是innodb管理存储空间的基本单位,默认大小为16kb.

指定和修改行格式的语法如下:

create table 表名(列的信息) row_format=行格式名称;

alter table 表名 row_format=行格式名称;

2.在COMPACT行格式中,所有变长字段的真实数据占用的字节数都存放在记录的开头位置,从而形成一个变长字段长度列表,各变长字段的真实数据占用的字节数按照列的顺序逆序存放。

3.InnoDB表的主键生成策略:

优先使用用户自定义的主键作为主键,如果用户没有定义主键,则选取一个不允许存储null值的unique键作为主键,如果表中连不允许存储null值的unique键都没有定义,则innoDB会为表默认添加一个名为row_id的隐藏列作为主键。

4.在mysql5.7中,默认开启每个表有独立表空间的配置,即对于创建每一个数据表,在mysql的存储目录下,都对应一个.ibd文件记录该表的数据信息,

5.redundant是一种比较原始的行格式,它是非紧凑的,而compact,dynamic以及compressed行格式是较新的行格式,它们是紧凑的(占用的存储空间更少)。

6.指定和修改行格式的语法如下:

create table 表名[列的信息] row_format=行格式名称

alter table 表名 row_format=行格式

7.Dynamic和compressed行格式:

这两种格式类似于compact行格式,不同处是处理行溢出数据时有点分歧,它们不会在记录的真实数据处存储字符串的前768个字节,而是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址;compressed行格式和dynamic不同的一点是,compressed行格式会采用压缩算法对页面进行压缩,已节省空间。

8.一个页一般是16KB,当记录中的数据太多,当前页放不下的时候,会把多余的数据存储到其他页中,这种现象称为行溢出。

9.myisam不支持热备,innodb支持热备,但是需要专门的工具

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论