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支持热备,但是需要专门的工具