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.事务的概述 为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...
随机推荐
- tpcc-mysql的安装和使用
tpcc-mysql介绍 TPC(Tracsaction Processing Performance Council) 事务处理性能协会是一个评价大型数据库系统软硬件性能的非盈利的组织,TPC-C是 ...
- MyLinkedList
/** * 节点类 * @author JP * */ class Node { Object value;//节点元素值 Node pre;//上一个节点 Node next;//下一个节点 pub ...
- JS中的作用域和作用域链
本文原链接:https://cloud.tencent.com/developer/article/1403589 前言 作用域(Scope) 1. 什么是作用域 2. 全局作用域和函数作用域 3. ...
- iBatis for net 框架使用
简介:ibatis 一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,到后面发展的版本叫MyBatis但都是指的同一个东西.最 ...
- 《毛毛虫组》【Alpha】Scrum meeting 1
第一天 日期:2019/6/14 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: (1)根据数据库设计时的E-R图将创建的表进行检查确保功能的正确实现. (2)进行公共类的设计,设计出程 ...
- USACO08FEB Hotel
题目传送门 线段树维护区间 线段树结构体 struct zzz{ int l,r,mi; //l为以左端点的为起点的最长子串 //r为以右端点为终点的最长子串 //mi是区间内部的最长子串 }tree ...
- redis基础知识学习
数据结构:1.String 添加: set key value get key getset key value (先get再set) incr key (key对应value原子性递增1) decr ...
- stataic 变量
static 是静态变量的的类型说明符 静态变量属于静态存储方式,(外部变量也是静态存储方式) 静态的局部变量 静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量在函数内定义 它的生存 ...
- 解决Windows 与Mac 双系统下的蓝牙设备共用的问题
不知道有多少人和我一样用的蓝牙鼠标或者键盘,有的话应该都会遇到同一个问题:即在一个系统下配好对后在另一个系统必须重新配对才能使用,很是麻烦.还要将蓝牙设备进入发现模式,OS下搜索,连接....终于昨天 ...
- 忘记root密码怎么办-单用户模式修改root密码
忘记root密码怎么办-单用户模式修改root密码================================= 1,开机3秒内按下向下的方向键,目的是为了不让它进入系统,而是停留在开机界面. 2 ...