在现场的环境中就很多时候会遇见update或者insert语句中内容带有单引号的问题,带有单引号会报错-2007;以及运行中也会出现常见的死锁类错误。本文针对这两个问题做了一个小总结用来参考。
在现场的环境中就很多时候会遇见update或者insert语句中内容带有单引号的问题,带有单引号会报错-2007。针对这种场景对这些做一个总结。
insert插入时内容带有单引号会执行失败,返回报错-2007
针对这类可以将单引号改为两个单引号,修改如下图:
修改后再来看执行情况:
如果存在一些特殊情况,业务无法通过上述方法实现。可以通过达梦内部的REPLACE函数实现
例:
注: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会话产生了死锁
处理过程
执行语句三产生了阻塞
执行语句四发现死锁了:
死锁事务自动结束。阻塞此时还需要我们人工干预。
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);
通过调用系统包来杀掉A会话,当杀掉A会话后资源会释放,B会话完成提交后会A会话会自动执行之前hang住的sql语句。
SQL> sp_close_session(140575828668176);
死锁源事务持有会话被杀掉后会自动连接
B执行后提交后A会话自动执行前面阻塞的语句。
通过杀会话可以达到释放资源解决阻塞问题。
注:达梦数据库中内部带有杀死锁机制。发生死锁系统会自动通过结束一个事务来解除死锁,而阻塞可能需要人工干预。
单引号类导致SQL语句错误,可以通过单引号变两个单引号,或者引用REPLACE函数解决。死锁的事务达梦会自动结束,阻塞问题需要找到相关的会话杀除,来释放锁资源解决。
文章
阅读量
获赞