Jdbc执行存储过程报数据库事务无法执行的异常
Jdbc执行存储过程报数据库事务无法执行的异常
环境:
Eclipse+Jdk1.7+spring-jdbc-3.0.7+同版本的jdbctemplate+Sqlserver 2012
问题:
一个小接口采用jdbctemplate进行对sqlserver的存储过程操作,一般过程执行没问题,但个别存储过程第一次可以执行,第二次再执行就异常;
原因参考:
https://blog.csdn.net/fenglibing/article/details/5160044
原因简要总结:
每次调用这个存储过程时,比如方法名为updateAllAttas(),下次执行select或其他dao操作会报数据库事务异常,这是由于jdbc的事务同sqlserver存储过程内部的事务发生冲突导致的,一般情况下如果sqlserver的事务中的代码执行时间过长的话,就会产生这种异常报错;每次执行updateAllAttas时,当前connection会产生问题,在方法执行后会被放入连接池,下次jdbc执行dao操作时,可能会从连接池中取出这个有问题的连接来执行dao操作,所以会报异常;解决方法就是:
1:存储过程中的BEGIN TRANSACTION,COMMIT TRANSACTION删除掉,存储过程中不采用事务机制,事务仅仅在jdbc中控制;
2:java中每次执行完updateAllAttas这个方法后,释放掉这个connection;那么下次dao操作时,由于连接池中没有这个有问题的连接了,所以下次可以正常执行dao操作。
方法1由于要修改存储过程,取消事务,当其他系统调用这个存储过程时,由于取消了事务会带来风险。所以采用方法2.将下面这个方法放到dao层类中,
public void releaseConnection(){
new ConnectionHolder(DataSourceUtils.getConnection(jdbcTemplateBASE.getDataSource())).released();
//释放连接,采用新连接
}
因为是采用jdbctemplate来进行dao操作的,上面方法中jdbctemplateBASE就是由spring管理的jdbctemplate对象;
在每次执行完updateAllAttas这个方法后,再调用releaseConnection这个方法即可;
注意,spring的jdbc的jar包中有好几个类似可以释放连接的方法,经调试,上述ConnectionHolder的released方法有效;其他如DataSourceUtils.releaseConnection(con,datasource)也有释放连接的方法,但是采用这个方法不能解决上述问题
Jdbc执行存储过程报数据库事务无法执行的异常的更多相关文章
- acid数据库事务正确执行的四个基本要素的缩写编辑本义项
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- ACID:数据库事务正确执行的四个基本要素
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- acid(数据库事务正确执行的四个基本要素的缩写)
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- ACID数据库事务正确执行的四个基本要素的缩写
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- acid (数据库事务正确执行的四个基本要素的缩写)
ACID,指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(T ...
- 执行存储过程报错——ora-01031:权限不足
1. 执行DDL报错 在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE ···了,如下备份表语句 --抄表表备 ...
- Oracle执行存储过程报错——ora-01031:权限不足
执行DDL报错 在oracle存储过程中,默认是可以直接执行DML和DQL的,但是执行CREATE这种的DDL则需要借助EXECUTE IMMEDIATE 如: create or replace p ...
- MVC仓储执行存储过程报错“未提供该参数”
今天做的时候出现错误: "过程或函数 'sp_ProcName' 需要参数 '@uid',但未提供该参数. 可是我参数都传了,然后调试也是一样,然后对照参数列表, 后来发现执行的时候还要加入 ...
- JDBC基础学习(四)—数据库事务
一.事务基本认识 1.事务的概述 为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...
随机推荐
- vs2015驱动开发中使用RtlStringCchPrintfW()报错
法一: 在头顶添加一段代码 #pragam comment(lib,"xxxxxx.lib") 法二: 右击工程点属性,选择Linker下的Input,在依赖项后面写上$(DDK_ ...
- java基础—抽象类介绍
一.抽象类介绍
- Nuget使用备忘
菜单:工具-库程序包管理器-管理解决方案的NuGet程序包,搜索,下载,安装 或者 工具-库程序包管理器-程序包管理器控制台,输入PM命令,如: install-package log4net 如果不 ...
- 【数学 技巧】divisor
没考虑重复lcm处理被卡TLE没A真是可惜 题目大意 $n$为$k-可表达的$当且仅当数$n$能被表示成$n$的$k$个因子之和,其中$k$个因子允许相等. 求$[A,B]$之间$k-可表达$的数的个 ...
- node 文件下载到本地 (支持中文文件名)
downloadfile:function(req,res,next){ var name= encodeURI(req.query.name); var path= req.query.url; v ...
- IE浏览器缓存问题解决方法(非常严重)
IE浏览器缓存问题解决方法整理 一.IE浏览器缓存的内容分析: IE浏览器会缓存网页中的GET和XHR的内容,并且在IE浏览器中如果请求方式是get方式的话,IE浏览器会进行识别,如果该get请求的u ...
- python入门:输出1-100之内的所有奇数和偶数(自写)
#!/urs/bin/env python # -*- coding:utf-8 -*- #输出1-100之内的所有奇数和偶数(自写) """ 给x赋值等于1,wehil ...
- tp5使用外部类的三种方法
在tp5中使用外部类的时候有三种方法 第一种就是通过composer下载,通过这种方式下载的外部类能够支持自动加载,我们只要在使用的时候use一下命名空间就可以使用了 比如:我们的tp5第四季项目要使 ...
- 用decimal模块增加python的浮点数精度
浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里 ...
- LeetCode(282) Peeking Iterator
题目 Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peek ...