1.1概述
锁是一种防止相互数据破坏的机制。当在访问共享数据的事务之间,错误的更新数据或更改数据结构,将引起数据一致性被破坏。锁在维护数据库并发性和一致性方面起着至关重要的作用。DM 数据库支持多用户并发访问、修改数据,有可能出现多个事务同时访问、修改相同数据的情况。若对并发操作不加控制,就可能会访问到不正确的数据,破坏数据的一致性和正确性。
事务锁定是数据库管理系统在处理并发事务时,为保证数据的一致性和完整性而采用的一种技术。它通过对数据对象加锁,限制其他事务对锁定的数据对象进行修改操作,从而避免了并发操作带来的问题。
1.2锁模式兼容性分类
1.2.1共享锁
共享锁(S 锁):也称为读锁,主要用于允许多个事务同时对同一份数据进行读取操作。当一个事务对数据加上共享锁后,其他事务仍然可以对该数据加上共享锁,实现并发读取。但是不允许其他事务对该数据进行写操作。
1.2.2排他锁
排他锁(X 锁):也称为写锁,主要用于确保数据在某一时刻仅被一个事务访问。当一个事务对数据加上排他锁后,其他事务无法修改或查询该数据。
1.2.3意向锁:
意向锁是一种特殊的锁,主要用于解决并发事务之间的锁等待问题。当一事务准备对某一行数据进行读取或写入操作时,它首先需要获取该行的意向锁。多个事务可以对相同对象上意向锁。
意向共享锁(IS 锁):一般在只读访问对象时使用;
意向排他锁(IX 锁):一般在修改对象数据时使用。
1.3锁模式颗粒度分类
1.3.1表锁:
表锁锁定整张表。
共享表锁:其他事务可以读,但不能更新该表。
排他表锁:其他事务不能对该表进行任何操作。
意向锁:是一种特殊的表级锁。当事务需要给某一行加锁时,它首先需要在表级别加上一个意向锁,表明“我的事务即将对这个表中的某些行进行操作”。这避免了为了检查行锁而逐行扫描。
意向共享锁:表明事务打算在表中的某些行上设置共享锁(S 锁)。
意向排他锁:表明事务打算在表中的某些行上设置排他锁(X 锁)。
1.3.2行锁:
行锁锁定表中的某一行或几行。
这是实现高并发最重要的锁。达梦的行锁也是S锁和X锁。
行锁总是在相应的事务结束时(提交或回滚)才被释放。
1.3.3页锁 / 区间锁:
页锁 / 区间锁是锁定数据页或物理上的连续数据区间。这是介于表锁和行锁之间的粒度。
1.3.4DDL锁:
DDL锁用于保护数据字典(模式对象)的定义。当用户修改一个表的结构时,会加DDL锁以防止其他会话同时修改或删除该表。
1.1概述
阻塞是锁机制带来的一个正常现象。
当一个事务正在占用某个资源的锁,此时另一个事务正在请求这个资源上与第一个锁相
冲突的锁类型时,就会发生阻塞。被阻塞的事务将一直挂起,直到持有锁的事务放弃锁定的
资源为止。
死锁:两个事务都在等待对方持有的资源锁,要等待对方释放有的资源锁之后才能继续工作,
两者互不想让,坚持到底,都在等待彼此完成才继续工作,就是这样的状态,双方都完成不
了,从而陷入死循环。
1.2处理
阻塞可能是应用流程涉及提交慢导致,但是最终也会提交或者回滚,所以一般情况下也
会自动消除。如果阻塞很长时间没有消除,在数据库层可以通过 SP_CLOSE_SESSION(SESSID);
来强制终阻塞源头的会话使其回滚,来解除阻塞,但是这个需要用户确认,不能私自操作。
锁等待解决方法
使用如下语句查询处于等待的锁(或查询 vtrxwait 可以查看阻塞事务):
select TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, TID from vlock where blocked=1;
1.3解决方法
1.3.1提交或回滚事务:
找到阻塞源头会话(BLOCKER_SESS),让其提交或回滚事务,从而释放锁。
1.3.2优化应用程序:
避免长事务,尽快提交;按相同顺序访问资源,防止死锁;根据业务场景选择合适的事务隔离级别(读已提交可以避免很多阻塞)。
1.3.3使用达梦的锁超时机制:
可以设置 INI 参数 WAIT_TIME,让被阻塞的事务在等待一定时间后自动超时并报错回滚,而不是无限期等待。
文章
阅读量
获赞