【数据库】涉及锁的问题

如何并发访问数据库

加锁

 

说下数据库的锁机制,数据库中都有哪些锁

锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候保护数据的。

一、有两种基本的锁类型

  1. 共享锁(S):多个事务可封锁一个共享页;任何事务都不能修改该页;通常是该页被读取完毕,S锁立即被释放。在执行select语句的时候需要给操作对象(表或者一些记录)加上共享锁,但加锁之前需要检查是否有排它锁,如果没有,则可以加共享锁(一个对象上可以加N个共享锁),否则不行。共享锁通常在执行完select语句之后释放,当然也有可能是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决与数据库所设置的事务隔离级别。
  2. 排它锁(X):仅允许一个事务封锁此页;其他任何事务必须等到排它锁被释放才能对该页进行访问;排它锁一直到事务结束才能被释放。执行insert、update、delete语句的时候需要给操作的对象加排它锁,在加排它锁之前必须确认该对象上没有其他任何锁,一旦加上排它锁之后,就不能再给这个对象加其他任何锁。排它锁的释放通常是在事务结束的时候(当然也有例外,就是在数据库事务隔离级别被设置成读未提交的时候,这种情况下排它锁会在执行完更新操作之后就释放,而不是在事务结束的时候)。

二、按锁的粒度

三、按锁的机制

既然使用了锁,就有出现死锁的可能

死锁详解

 

MySQL锁的粒度(即锁的级别)

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

1)表级锁

直接锁定整张表,在你锁定期间,其他进程无法对该表进行写操作。如果你是写锁,则其他进程的读操作也不允许。特点:开销小,加载快;不会出现死锁;锁定粒度最大,发生锁冲突的概率最高;并发度最低。

MyISAM存储引擎采用的就是表级锁

有2种模式:表共享读锁和表独占写锁。加读锁的命令:lock table 表名 read;去掉锁的命令:unlock tables;

支持并发插入:支持查询和插入操作并发执行(在表尾并发插入)。

锁调度机制:写锁优先。一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理?答案是写进程先获得锁。

2)行级锁

仅对指定的记录进行加锁,这样其他线程还是可以对同一个表中的其他记录进行操作。特点:开销大;加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也高。

InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。

3)页级锁

一次锁定相邻的一组记录。开锁和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

最常用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其他用户就不能在访问该对象。加锁对并发访问的影响体现在锁的粒度上。比如,(表锁)放在一个表上的锁限制对整个表的并发访问;(页锁)放在数据页上的锁限制了对整个数据页的访问;(行锁)放在行上的锁限制了对该行的并发访问。

 

乐观锁和悲观锁

锁有两种机制:乐观锁和悲观锁

详情请点击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值