注册
达梦数据库单引号导致SQL语句报错code-2007以及死锁问题解决
培训园地/ 文章详情 /

达梦数据库单引号导致SQL语句报错code-2007以及死锁问题解决

VIII 2023/06/16 3133 0 0

背景说明

在现场的环境中就很多时候会遇见update或者insert语句中内容带有单引号的问题,带有单引号会报错-2007;以及运行中也会出现常见的死锁类错误。本文针对这两个问题做了一个小总结用来参考。

单引号类导致SQL语句报错

说明

在现场的环境中就很多时候会遇见update或者insert语句中内容带有单引号的问题,带有单引号会报错-2007。针对这种场景对这些做一个总结。

insert测试

insert插入时内容带有单引号会执行失败,返回报错-2007
image.png
针对这类可以将单引号改为两个单引号,修改如下图:
image.png
修改后再来看执行情况:
image.png

update测试

image.png
image.png
image.png

额外

如果存在一些特殊情况,业务无法通过上述方法实现。可以通过达梦内部的REPLACE函数实现
image.png
例:
image.png
image.png
注:REPLACE函数可实现的转换不仅限于单双引号,其他字符均可实现转换。

小结

达梦数据库单引号类引发的update语句或者insert语句报错,可以通过将单引号变换为两个单引号解决。某些特殊情况下可以通过REPLACE函数来解决。

死锁类解决

说明

死锁是数据库运行中非常常见的一个问题,在此也对死锁的处理方式做一个说明。

步骤一:模拟死锁

1 建表插数据

create table testlock (id int,name char(30));
insert into testlock values(1,'aaa');
insert into testlock values(2,'bbb');
insert into testlock values(12,'ccc');
insert into testlock values(3,'das');
insert into testlock values(4,'fds');
commit;

2 通过DML语句制造阻塞和死锁

//A会话(语句一)
update testlock set id=1 where name='bbb';
//B会话(语句二)
update testlock set id=2 where name='aaa'; 
//A会话(语句三)
update testlock set id=3 where name='aaa';
//此时A会话已经hang住,产生了阻塞
//B会话(语句四)
update testlock set id=4 where name='bbb';
//B会话产生了死锁

处理过程
执行语句三产生了阻塞
image.png
执行语句四发现死锁了:
image.png
死锁事务自动结束。阻塞此时还需要我们人工干预。

步骤二:查询阻塞事务的线程号和SQL语句

SELECT 
	VTW.ID AS TRX_ID,VS.SESS_ID,VS.SQL_TEXT,VS.APPNAME,VS.CLNT_IP 
FROM 
	V$TRXWAIT VTW LEFT JOIN V$TRX VT 
		ON(VTW.ID=VT.ID) 
	LEFT JOIN V$SESSIONS VS 
		ON(VT.SESS_ID=VS.SESS_ID);

image.png

步骤三:释放锁资源

通过调用系统包来杀掉A会话,当杀掉A会话后资源会释放,B会话完成提交后会A会话会自动执行之前hang住的sql语句。

SQL> sp_close_session(140575828668176);

死锁源事务持有会话被杀掉后会自动连接
image.png
B执行后提交后A会话自动执行前面阻塞的语句。
image.png
image.png

小结

通过杀会话可以达到释放资源解决阻塞问题。
注:达梦数据库中内部带有杀死锁机制。发生死锁系统会自动通过结束一个事务来解除死锁,而阻塞可能需要人工干预。

总结

单引号类导致SQL语句错误,可以通过单引号变两个单引号,或者引用REPLACE函数解决。死锁的事务达梦会自动结束,阻塞问题需要找到相关的会话杀除,来释放锁资源解决。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服