java jdbc使用事物处理死锁

问题描述

con.setAutoCommit(false);pstmt=con.prepareStatement(sql1);//实例化PreapredStatement对象pstmt.execute();//执行pstmt=con.prepareStatement(sql2);//实例化PreapredStatement对象pstmt.execute();//执行con.commit();使用事物就出现java.sql.SQLException:Deadlockfoundwhentryingtogetlock;tryrestartin求大神解决

解决方案

解决方案二:
你的两句sql当中有问题么?放到plsql之类的客户端中跑,会跑死锁么?
解决方案三:
引用1楼skgary的回复:

你的两句sql当中有问题么?放到plsql之类的客户端中跑,会跑死锁么?

如果不用事物能正常执行用事物并发时就异常
解决方案四:
引用2楼xiaov2的回复:

Quote: 引用1楼skgary的回复:
你的两句sql当中有问题么?放到plsql之类的客户端中跑,会跑死锁么?

如果不用事物能正常执行用事物并发时就异常

我问的不是在java代码里增加事物,而是在sql的客户端里面跑你的sql.如果在客户端里都有问题的话,只能是sql语句的问题
解决方案五:
大神来帮帮忙
解决方案六:
是什么数据库?
解决方案七:
引用5楼gaofuqi的回复:

是什么数据库?

mysql
解决方案八:
你的sql1和sql2是怎么写的
解决方案九:
引用7楼longtian1213的回复:

你的sql1和sql2是怎么写的

就是简单的sql1是插入sql2是更新不用事物的话没问题(但是我担心万一其中一条执行了另一条没执行所有要用事物)
解决方案十:
存储引擎是什么?两个语句又是什么?
解决方案十一:
引用9楼fangmingshijie的回复:

存储引擎是什么?两个语句又是什么?

sql就是最简单的插入a表一条数据更新b表一条数据
解决方案十二:
引用3楼skgary的回复:

Quote: 引用2楼xiaov2的回复:
Quote: 引用1楼skgary的回复:
你的两句sql当中有问题么?放到plsql之类的客户端中跑,会跑死锁么?

如果不用事物能正常执行用事物并发时就异常

我问的不是在java代码里增加事物,而是在sql的客户端里面跑你的sql.如果在客户端里都有问题的话,只能是sql语句的问题

sql语句没问题正常运行
解决方案十三:
引用6楼xiaov2的回复:

Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。
解决方案十四:
引用12楼gaofuqi的回复:

Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?
解决方案十五:
引用13楼xiaov2的回复:

Quote: 引用12楼gaofuqi的回复:
Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?

什么意思?你通过客户端界面修改,还是执行SQL命令?
解决方案:
引用14楼gaofuqi的回复:

Quote: 引用13楼xiaov2的回复:
Quote: 引用12楼gaofuqi的回复:
Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?

什么意思?你通过客户端界面修改,还是执行SQL命令?

mysql工具
解决方案:
引用15楼xiaov2的回复:

Quote: 引用14楼gaofuqi的回复:
Quote: 引用13楼xiaov2的回复:
Quote: 引用12楼gaofuqi的回复:
Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?

什么意思?你通过客户端界面修改,还是执行SQL命令?

mysql工具

我知道是客户端工具,你是以命令行的方式修改还是在界面上修改?其实这个问题不重要,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。
解决方案:
引用16楼gaofuqi的回复:

Quote: 引用15楼xiaov2的回复:
Quote: 引用14楼gaofuqi的回复:
Quote: 引用13楼xiaov2的回复:
Quote: 引用12楼gaofuqi的回复:
Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?

什么意思?你通过客户端界面修改,还是执行SQL命令?

mysql工具

我知道是客户端工具,你是以命令行的方式修改还是在界面上修改?其实这个问题不重要,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

大神这个pstmt.execute();//执行是最后执行一次还是每次都要执行
解决方案:
引用17楼xiaov2的回复:

Quote: 引用16楼gaofuqi的回复:
Quote: 引用15楼xiaov2的回复:
Quote: 引用14楼gaofuqi的回复:
Quote: 引用13楼xiaov2的回复:
Quote: 引用12楼gaofuqi的回复:
Quote: 引用6楼xiaov2的回复:
Quote: 引用5楼gaofuqi的回复:
是什么数据库?

mysql

mysql好像支持表级锁,不支持行级锁,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

我手动改数据时只有操作的那行数据不能操作其他可以有解吗?

什么意思?你通过客户端界面修改,还是执行SQL命令?

mysql工具

我知道是客户端工具,你是以命令行的方式修改还是在界面上修改?其实这个问题不重要,你看一下你的Mysql版本,看看是否支持行级锁,然后从SQL语句分析,可能并发的操作两张表,相互在等待对方释放锁,造成死锁。

大神这个pstmt.execute();//执行是最后执行一次还是每次都要执行

你就不能看一下的你的MYSQL版本是多少?存储引擎是什么?
解决方案:
错误是哪行报的?
解决方案:
没有beginTransaction吗?看看你的sql语句时候操作同一张表吧
解决方案:
引用18楼gaofuqi的回复:

你就不能看一下的你的MYSQL版本是多少?存储引擎是什么?

其实大家的怀疑是一致的,就是sql本身的问题。。。

时间: 2025-01-29 10:17:12

java jdbc使用事物处理死锁的相关文章

Java线程:并发协作-死锁

发生死锁的原因一般是两个对象的锁相互等待造成的. 在<Java线程:线程的同步与锁>一文中,简述死锁的概念与简单例子,但是所给的例子是不完整的,这里给出一个完整的例子. /** * Java线程:并发协作-死锁 * * @author Administrator */ public class Test { public static void main(String[] args) { DeadlockRisk dead = new DeadlockRisk(); MyThread t1 =

对象-java JDBC 批量插入的时候报数组下标越界,求大神

问题描述 java JDBC 批量插入的时候报数组下标越界,求大神 代码:private static Boolean Function_User(Map resultMap String sqlString tableType) { // TODO Auto-generated method stub Connection conn=null; PreparedStatement insert_st=null; int count = 0; final int batchSize = 500;

【编程】java jdbc/ojdbc 链接oracle的三种方式

  本文是一篇学习笔记,学习如何通过java jdbc /ojdbc 连接oracle的几种方式.一 使用方法方法一:使用service_name 连接oracle  jdbc:oracle:thin:@//:/ 例如: jdbc:oracle:thin:@//10.10.10.1:1521/TDB注意这里的格式,@后面有//, 这是与使用SID的主要区别.对于集群来说,每个节点的SID 是不一样的,但是SERVICE_NAME 确可以包含所有节点. 方法二: 使用SID 连接oracle jd

java jdbc 对 DB2 数据库 做CRUD 操作

问题描述 java jdbc 对 DB2 数据库 做CRUD 操作 本人想通过 java 的jdbc 连接 DB2 数据库,并对数据库进行操作,操了好几天了, 是这样的报错 的 DB2 SQL error: SQLCODE: -805, SQLSTATE: 51002, SQLERRMC: null 自己也去找了这个报错是什么意思, 网上是这样解释的 : -805 在计划中没有发现DBRM或程序包名 解决的办法就是重新绑定 然后自己又去 找 怎么绑定的方法. 我之前一直用的 sql server

java jdbc连接mysql数据库插入null值问题

问题描述 java jdbc连接mysql数据库插入null值问题 ps.setFloat(8 device.getLatitude());如果device.getLatitude()返回的是null就报错,也就是说setFloat不能插入空值,而setString()方法就可以,不知道为什么请高手指点,谢谢!! 解决方案 PreparedStatement.java 的给方法签名是这样的public void setFloat(int parameterIndex float x) throw

java JDBC关于登录数据库

问题描述 java JDBC关于登录数据库 public static void main(String[] args) { Connection conn=null; try { conn=DriverManager.getConnection(""jdbc:sqlserver://localhost:1433;DatabaseName=master""sa""sa""); System.out.println("

Java JDBC学习实战(二): 管理结果集

在我的上一篇博客<Java JDBC学习实战(一): JDBC的基本操作>中,简要介绍了jdbc开发的基本流程,并详细介绍了Statement和PreparedStatement的使用:利用这两个API可以执行SQL语句,完成基本的CURD操作.那么,当我们进行查询操作,查询到了结果集,该如何处理呢? Java提供了一个API,专门用于表示查询的结果集--ResultSet.此外,还提供了一个结果集的分析工具--ResultSetMetaData. 一. ResultSet的介绍 1.1 可移

怪异问题!sql在pl/sql中执行结果与java jdbc执行结果不一致

问题描述 做一查询系统(struts2+myeclipse+tomcat+oracle9),一般先在pl/sql中测试sql语句,无问题后在action中使用oracle thin模式连接数据库,执行sql语句,然后将查询结果存入HashMap后输出至jsp页面.出现如下怪异问题:1.在pl/sql中测试sql语句时结果正常.结果中有6个字段,其中两个字段为count()函数统计出的数值.2.将在pl/sql中测试过的sql语句写入struts2的action中,通过jdbc thin模式执行,

Java JDBC数据库链接

好久没有编写有关数据库应用程序啦,这里回顾一下java JDBC. 1.使用Java JDBC操作数据库一般需要6步: (1)建立JDBC桥接器,加载数据库驱动: (2)连接数据库,获得Connection对象(使用数据库连接地址,用户名,密码): (3)获得数据库Statement对象: (4)执行数据库操作: (5)读取结果: (6)关闭数据库连接: 2.使用Java JDBC操作数据库(mysql)代码: 连接mysql数据库,需要导入mysql数据库jar包,本代码使用mysql-con