面试-数据库锁

一、锁的概念 
锁(LOCKING)是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的资源(如表和记 录)存取前,先向系统提出请求,封锁该资源,事务获得锁后,即取得对数据的控制权,在事务释放它的锁之前,其他事务不能更新此数据。当事务撤消后,释放被 锁定的资源。 
当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象 

二、锁的模式 

排他锁:当数据对象被加上排它锁时,其他的事务不能对它读取和修改。

共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。

三、死锁

产生死锁的两个条件:1.数据量大   2.多个用户同时并发 

 如何避免死锁 
1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; 
2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂; 
3 所有的SP都要有错误处理(通过@error) 
4 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁 
5 优化程序,检查并避免死锁现象出现; 
1)合理安排表访问顺序 
2)在事务中尽量避免用户干预,尽量使一个事务处理的任务少些。 
3)采用脏读技术。脏读由于不对被访问的表加锁,而避免了锁冲突。在客户机/服务器应用环境中,有些事务往往不允许读脏数据,但在特定的条件下,我们可以用脏读。 
4)数据访问时域离散法。数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实 现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理。工作流在管理任务时,一方面限制同一类任务的线程数(往往限制为1个),防止资源过多占 用; 另一方面合理安排不同任务执行时序、时间,尽量避免多个后台任务同时执行,另外,避免在前台交易高峰时间运行后台任务 
5)数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过以下方法实现: 第一,将大表按行或列分解为若干小表; 第二,按不同的用户群分解。 
6)使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度,SQL92定义了4种隔离性级别:未提交读、 提交读、可重复读和可串行。如果选择过高的隔离性级别,如可串行,虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性,但各事务间冲突而 死锁的机会大大增加,大大影响了系统性能。 
7)使用Bound Connections。Bound connections 允许两个或多个事务连接共享事务和锁,而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样,因此可以允许这些事务共享数据而不会有加锁的冲突。 
8)考虑使用乐观锁定或使事务首先获得一个独占锁定。

### 数据库机制的面试题及相关答案解析 数据库中的是一种用于控制并发事务访问共享资源的方式,目的是防止多个事务同时修改同一数据而导致不一致的情况发生。以下是几个常见的关于数据库机制的面试问题及其答案解析。 #### 1. 数据库有哪些类型? 数据库主要分为以下几种类型[^4]: - **行级 (Row-Level Lock)**:定单条记录,适用于高并发场景。 - **表级 (Table-Level Lock)**:定整个表,通常用于批量操作或低并发需求的情况下。 - **意向 (Intent Lock)**:表示某个事务打算对某一层级的数据加,例如意向共享 (IS) 和意向排他 (IX)[^4]。 ```sql SELECT * FROM table_name WHERE id = 1 FOR UPDATE; ``` 上述SQL语句会为查询到的结果加上行级[^5]。 --- #### 2. InnoDB 支持哪些类型的?它们的作用是什么? InnoDB 存储引擎支持两种主要的模式[^6]: - **共享 (Shared Lock, S)**:允许多个事务读取某一资源而不互相干扰。 - **排他 (Exclusive Lock, X)**:确保只有一个事务可以写入某一资源。 此外,还有混合使用的模式: - **间隙 (Gap Lock)**:阻止其他事务在两个键之间的间隙插入新记录。 - **Next-Key **:结合了行和间隙的功能,主要用于解决幻读问题[^7]。 --- #### 3. 死是如何产生的?如何避免死? 当两个或更多事务相互持有对方所需的资源并等待释放时就会形成死[^8]。可以通过以下方法来减少死的发生概率: - 尽可能缩短事务的时间长度; - 按照固定的顺序获取- 使用较低级别的隔离级别(如 READ COMMITTED 而不是 SERIALIZABLE)。 如果仍然发生了死,则依赖于 DBMS 自动检测并回滚其中一个事务以解除僵局[^9]。 --- #### 4. 并发控制中 MVCC 是什么意思?它是怎么工作的? MVCC 即多版本并发控制(Multi-Version Concurrency Control),通过保存数据的历史版本实现高效的读写分离[^10]。具体工作原理如下: - 每次更新都会创建一个新的版本而不是覆盖旧值; - 查询只看到提交前的状态或者自己启动之后所做的更改; - 删除标记该条目已失效但不会立即清除物理存储直到没有未完成交易引用为止。 这种机制允许较高的吞吐量因为大多数情况下不需要显式地申请任何种类的实际意义上的“”。 --- #### 5. 解释乐观与悲观的区别? 两者的主要区别在于对待冲突的态度不同[^11]: - **悲观(Pessimistic Locking)** 假设最坏情况下的竞争状况频繁存在因此总是先获得必要的权限再继续处理逻辑直至结束才会放开这些约束条件从而保障一致性不受破坏。 - 对应地,**乐观(Optimistic Locking)** 则认为多数时候不会有太多重叠请求所以仅需验证最终状态即可确认中间过程无误进而提高效率降低成本开销. 实际开发过程中可根据业务特点选择合适方式实施保护措施. ```java // 示例代码展示乐观的应用场景之一 - 版本号校验法 public boolean updateStock(int productId,int expectedVersion,int newQuantity){ int affectedRows=entityManager.createQuery( "UPDATE Product p SET p.quantity=:newQty,p.version=p.version+1"+ "WHERE p.id=:prodId AND p.version=:expVer" ) .setParameter("newQty",newQuantity) .setParameter("prodId",productId) .setParameter("expVer",expectedVersion) .executeUpdate(); return affectedRows==1; // 成功返回true 失败false } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值