(四)
AntDB-T数据库常规锁使用场景
前面部分介绍了锁相关的理论部分,下面举个常规锁的例子来体会下锁。
1.数据准备:建表,构造数据,具体SQL 如下图6所示:

图6:数据准备
2. 会话一执行开始事务和UPDATE语句如下图7所示,此时会话表上的锁模式为RowExclusiveLock 。

图7:开始事务和更新表
3. 会话二执行ALTER TABLE语句,这时看到修改表语句处于等待状态,如下图8所示:此时会话表上需要加锁的模式是AccessExclusiveLock,该模式与会话一上持有的锁模式冲突,所以此SQL语句会一直等在那里。

图8:修改表
4. 会话三查找锁等待的进程号以及锁信息,如下图9所示:

图9:查找锁等待的进程信息
这里可以看到等待的锁时一个表锁,锁模式是AccessExclusiveLock,pid为541258。
5. 会话三根据锁等待的进程pid找到当前持有锁的进程,并查看持有锁进程的详细情况,比如对应的应用、SQL、等待事件等,如下图10所示:

图10:查找锁持有的进程信息
6.验证等待锁、持有锁的进程pid是否正确,用ps查看过滤下想要的进程, 如下图11所示:

图11:验证等待锁持有锁的进程pid
从上图11中可以看出,等待锁的进程pid 为541258 在执行ALTER TABLE操作,与图9查出的进程pid一致,持有锁的进程pid为541046,处在空闲事务状态,与图10查出的进程pid一致。会话二语句目前一直等在那里,要等到会话一结束,才能执行成功。如果会话一忘记COMMIT/ROLLBACK了,也不要太担心,AntDB-T数据库提供了一些超时参数,当超过配置的参数时,就会自动结束会话。
参数idle_in_transaction_session_timeout:在一个空闲的事务中,空闲时间超过这个值,将视为超时,0表示禁用,一般默认都是禁用。获取一个表,索引,行上的锁超过这个时间,直接报错,不等待,0为禁用。
参数lock_timeout:获取一个表,索引,行上的锁超过这个时间,直接报错,不等待,0为禁用。
参数statement_timeout:当SQL语句的执行时间超过这个设置时间,终止执行SQL,0为禁用。
参数deadlock_timeout:死锁时间超过这个值将直接报错,不会等待,默认设置为1s。
总结
本文主要讲述了AntDB-T数据库锁的分类、常规锁的基本概念、常规锁的设计以及常规锁具体使用的场景。限于篇幅原因,与常规锁相关的死锁检测、行锁等相关内容没有涉及,以后有机会将会进行分享。
关于亚信安慧AntDB数据库
亚信安慧AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。




