首页 > 其他分享 >KingbaseES V8R6等待事件之 lock: transactionid

KingbaseES V8R6等待事件之 lock: transactionid

时间:2024-07-26 11:10:02浏览次数:15  
标签:事务 V8R6 lock UPDATE 阻塞 sys transactionid KingbaseES SELECT

等待事件含义

Lock:在数据库管理系统中,锁是用来确保数据完整性和一致性的重要机制。当一个事务需要修改数据时,它会请求一个锁来防止其他事务同时修改相同的数据,从而导致数据不一致。
transactionid:这通常是一个唯一标识符,用于区分和跟踪数据库中的不同事务。每个事务都有一个唯一的ID,这样系统就可以知道哪些操作属于同一个事务,哪些操作属于不同的事务。
等待:当一个事务尝试获取一个锁但发现该锁已经被另一个事务持有时,它就会进入等待状态。这意味着该事务会暂停其操作,直到锁被释放。这确保了并发操作之间的顺序性和一致性。
出现这个Lock:transactionid等待事件原因往往和业务逻辑有关系。

等待时间增加的可能原因

等待事件Lock:transactionid发生在当一个事务试图获取一个行级锁,而这个锁已经被已经运行的另一个事务授予。显示 Lock:transactionid 等待事件的会话由于这个锁而被阻塞。在阻塞事务中 COMMIT 或 ROLLBACK 语句结束时,被阻塞的事务可以继续进行。通常涉及并发控制和事务管理的场景。
KES的的多版本并发控制(MVCC)保证了事务中读不会阻塞写,写也不会阻塞读。对于行级冲突的发生,阻塞和被阻塞的事务必然发生在以下类型的冲突语句:
UPDATE 加对应行级锁,这意味着其他事务不能同时修改或锁定相同的行,直到原事务提交或回滚。
SELECT ... FOR UPDATE 阻止其他事务修改或锁定所选的行。
SELECT ... FOR KEY SHARE 阻止其他事务进行 UPDATE、DELETE 或 SELECT ... FOR UPDATE 操作,但允许使用 SELECT ... FOR KEY SHARE 或仅读取这些行。
不同的sql语句会对应不同的锁类型。
参考锁机制文章:https://www.cnblogs.com/kingbase/p/15911906.html

高并发
KES 可以使用细粒度的行级锁。当并发性增加时,多事务间行级锁冲突的概率会增加,他们之间会竞争相同的行级锁:

空闲事务
有时,sys_stat_activity.state 列会显示值 idle in transaction。这个值发生在已经启动了一个事务但尚未发出 COMMIT 或 ROLLBACK 的会话中。如果 sys_stat_activity.state 的值不是 active,对应显示的查询是最近一个已经完成的查询。
如果一个空闲的事务获取了行级锁,它可能会阻止其他会话获取该锁。这种情况会导致 Lock:transactionid 等待事件频繁发生。为了诊断问题,我们可以监控kwr报告中的等待事件部分。

解决方法

行锁是UPDATE、SELECT ... FOR UPDATE或SELECT ... FOR KEY SHARE等语句之间的冲突。先找出业务运行期间行锁阻塞信息,解决阻塞源问题。
相关sql查询语句:

SELECT
sys_locks.pid,
a.datname,
locktype,
virtualtransaction,
transactionid,
nspname,
relname,
mode,
granted,
cast(date_trunc('second',query_start) AS timestamp) AS query_start
FROM
sys_locks
LEFT OUTER JOIN sys_class ON (sys_locks.relation = sys_class.oid)
LEFT OUTER JOIN sys_namespace ON (sys_namespace.oid = sys_class.relnamespace),
sys_stat_activity a
WHERE NOT sys_locks.pid = sys_backend_pid()
AND sys_locks.pid=a.pid
and sys_class.relname='';

应对高并发,可以尝试以下方法
在应用中降低并发量。例如,减少活动会话的数量,使用连接池管理连接数,并发数。
重新设计应用程序的业务逻辑避免争用的UPDATE和SELECT … FOR UPDATE等语句,还可以减少SELECT … FOR KEY SHARE语句的访问。

处理空闲事务
如果sys_stat_activity.state显示为空闲事务(idle in transaction),请使用以下方法:
尽可能开启自动提交(autocommit,默认开启,查看方式:\echo :AUTOCOMMIT)。这种方法可以防止事务在等待COMMIT或ROLLBACK时阻塞其他事务。
在数据库或应用程序级别设置事务超时,确保空闲事务在达到某个时间限制后被自动终止,例如在数据库设置参数idle_in_transaction_session_timeout。

处理长时间运行的事务
长时间运行的事务可能导致频繁出现“Lock:transactionid”的问题,
在长时间运行的事务中避免使用行锁,解决阻塞源,然后排查业务逻辑,协商应用人员对其进行修改。
使用数据库的EXPLAIN ANALYZE命令来查看查询sql的执行计划,并找出可能的性能瓶颈。
如果可能,将大事务分割成多个小事务。
在应用程序级别或连接池设置事务超时参数,以确保长时间运行的事务在达到某个时间限制后被自动终止,但这个方法不是最优选择。

标签:事务,V8R6,lock,UPDATE,阻塞,sys,transactionid,KingbaseES,SELECT
From: https://www.cnblogs.com/kingbase/p/18280396

相关文章

  • KingbaseES 更改 WAL 日志文件大小
    一、引言WAL日志的目的:WAL(Write-AheadLogging)是KingbaseES数据库中的一个关键特性,用于确保在数据库崩溃或故障后能够恢复数据。WAL日志记录了数据库的所有更改,这样即使数据库突然宕机,也可以从WAL文件中恢复数据到一致性状态。命令的功能:sys_resetwal命令用于重置WAL日志,它可以......
  • KingbaseES 数据库无响应问题分析
    一、背景及理论阐述某项目数据库系统是集群环境,主库业务卡顿,应用反馈部分业务无法正常进行。在操作系统中,物理内存(RAM)是有限的资源,当内存需求超过物理内存的容量时,操作系统会使用页面调度机制来管理内存资源。页面调度涉及将不常用的内存页面(Page)移到磁盘上的交换空间(SwapSpace......
  • KingbaseES 对象状态规则总结
    KingbaseES的PLSQL对象包括函数、存储过程、触发器、包、包体、对象类型、对象类型体和匿名块,其中匿名块即用即销,不具有状态属性,SQL中存在依赖的常见对象是表,视图,索引,自定义类型,自定义操作符等等。在使用编码过程会存在相互引用和被引用,就会导致对象的增删改无法“顺利”进行,本文......
  • KingbaseES 自定义操作符使用示例
    本文详细介绍了KingbaseES中在兼容适配过程中,当遇到不支持的操作符,如何通过自定义方式解决兼容适配问题。Kingbase自定义操作符语法和用例如下:用例数据:createtabledemo(idnumeric(10,5));insertintodemovalues(1.1);insertintodemovalues(0);insertintodemoval......
  • KingbaseES 集群运维典型案例 03 --“双主” sys_rewind恢复机制
    案例说明:主库主机系统重启,触发failover切换,原主库系统启动后,数据库服务被启动,出现“双主”,使用“repmgrnoderejoin--force-rewind”恢复集群。通过本案例了解,集群“双主”产生的原因及解决方案,并熟悉sys_rewind在集群恢复中的应用。数据库版本:KingbaseESV8R6一、集群架构......
  • 【YashanDB知识库】stmt未close,导致YAS-00103 no free block in sql main pool part 0
    问题现象问题单:YAS-00103nofreeblockinsqlmainpoolpart0,YAS-00105outofmemorytoallocatehashtableofsize=256现象:业务处理sql时,报错YAS-00103nofreeblockinsqlmainpoolpart0问题风险及影响业务处理报错,影响功能使用问题影响版本客户版本:22.2.4......
  • ReentrantReadWriteLock
    ReentrantReadWriteLock是Java的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。在并发场景中,为了解决线程安全问题,我们通常会使用关键字synchronized或者JUC包中......
  • 可重入锁ReentrantLock
    ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞。要想支持重入性,就要解决两个问题:在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功......
  • pymobiledevice3:如果没有抽象方法“_create_service_connection”的实现,则无法实例化
    全面披露:我不知道我在做什么。我没有编程经验。我已要求ChatGPT为我创建一个程序。ChatGPT为我创建的文件之一名为“device_detection.py”。这个特定文件应该检测通过USB端口连接到我的笔记本电脑的智能手机设备,然后在终端中打印结果。如果这就是我所需要的,那就太好了(并且......
  • Code::Blocks 字体修复
    有的时候Code::Blocks无法使用某些字体,本文将讲解如何修复。首先打开Code::Blocks,点击Settings\(\rightarrow\)Editor,找到Choos按钮并点击,选择你想要的字体,并选择字体大小\(10\)(这里是数字不是中文!),点击确定,再点击一个OK。这是会弹出一个报错窗口,选择Continue,这时字......