OracleCommand执行ExecuteNonQuery出现程序挂起现象

2024-02-15 17:48

本文主要是介绍OracleCommand执行ExecuteNonQuery出现程序挂起现象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

string sql = "INSERT INTO TempTable (A, B, C) VALUES ('2222222', '1111111', 'RRR')";//A为主键
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.ExecuteNonQuery();

在执行这段代码的时候,第一次插入没有成功,当Stop Debug再重新启动的时候,发现程序运行到cmd.ExecuteNonQuery的时候就卡住不动了。造成这个的原因是Oracle的block机制。

If session "A" inserts a row in a table with a primary key, session "A" will block ANY other session attempting to insert the same primary key until session "A" commits or rolls back the insert. All other attempts to insert will "hang".

此时我在代码中把sql语句主键2222222换成33333333,那么就能顺利插入。说明只有在相同的主键情况下,这个操作才会被block. 因为以前插入2222222的时候,程序意外结束,但是对于Oracle端事务并没有提交或者回滚,所以就锁定了这一个主键。注意,仅仅是这一个值的主键。

这里还有一个问题,就是现在我打开SQL Developer,执行插入2222222的主键语句,会顺利的执行完成,不发生卡住现在,而用代码执行SQL语句还是会发生卡住现象。但是我重启VS,新建一个项目,写入这些代码,也相当于另外的一个程序来执行这个插入语句,也是会有卡住现象。可能跟使用的.net provider有关?因为使用的是同一个Provider,所以卡住。因为SQL Developer没有使用这个provider,所以不会卡住?这只是一个猜测。

这种lock叫做TMlock,也叫row transaction lock, 可以使用SQL语句查看是否有这种lock

SELECT sid, id1 FROM v$lock WHERE TYPE='TM'

SID ID1
76 14197

SELECT * FROM dba_objects WHERE object_id = 14197;

OBJECT_NAME                                                                                                                    
--------------------------------------------------------------------------------------------------------------------------------
TemTable


如何解除这个TM lock?row transaction lock

在SQL Developer UI执行一个Commit命令就行了。

这篇关于OracleCommand执行ExecuteNonQuery出现程序挂起现象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712085

相关文章

Mysql 驱动程序的程序小结

《Mysql驱动程序的程序小结》MySQL驱动程序是连接应用程序与MySQL数据库的重要组件,根据不同的编程语言和应用场景,MySQL提供了多种驱动程序,下面就来详细的了解一下驱动程序,感兴趣的可以... 目录一、mysql 驱动程序的概念二、常见的 MySQL 驱动程序1. MySQL Connector

MyBatis Plus中执行原生SQL语句方法常见方案

《MyBatisPlus中执行原生SQL语句方法常见方案》MyBatisPlus提供了多种执行原生SQL语句的方法,包括使用SqlRunner工具类、@Select注解和XML映射文件,每种方法都有... 目录 如何使用这些方法1. 使用 SqlRunner 工具类2. 使用 @Select 注解3. 使用

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法