java 数据表死锁问题

问题描述

publicsynchronizedintaaa(){conn.setAutoCommit(false);修改表1数据.executeUpdate()..........修改表2数据.executeUpdate()conn.commit();}publicsynchronizedintbbb(){conn.setAutoCommit(false);修改表2数据.executeUpdate()..........修改表1数据.executeUpdate()conn.commit();}如上所示两个事务处理过程同时访问造成死锁应如何处理

解决方案

解决方案二:
放到同一个类中,让aaa,bbb不能同时执行
解决方案三:
把两个方法放到同一个类中,并且使用单例模式,只创建一个对象,这样就不能同时访问这两个方法了
解决方案四:
我想是在指向aaa或是bbb的时候先同时拿到表1和表2的锁拿不到的则等待!这样能实现吗!!!
解决方案五:
synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}
解决方案六:
引用4楼wangxf_8341的回复:

synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}

解决方案七:
楼主,这种设计是要不得的,这样必然会死锁。引用4楼wangxf_8341的回复:

synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}

这方法可行

时间: 2024-10-22 15:42:22

java 数据表死锁问题的相关文章

java web ssh2框架 对象和数据表问题

问题描述 java web ssh2框架 对象和数据表问题 ssh2有几个对象肯定有几个数据表.但是难道每个数据表都要生成一个对象吗?还有dao service层,这个该怎么处理啊. 解决方案 一般都是一张表对应一个实体类对象,不过有的中间关联表你也可以不创建实体类对象, 可以通过sql进行控制 解决方案二: 一般是实体类对应一张表,虽然现在大部分都是先建表在设实体类,但是也有是先成实体类然后自动生成表的.至于dao和service层不清楚你说的具体是什么问题 解决方案三: SSH框架+Orac

java对SQL2005数据表打包的一些问题,急急急

问题描述 我用java对SQL2005的数据表进行读写,connection采用的loaclhost的,那么我能否把数据表一起打包到jar文件中?如何实现?connection那里需要更改吗?不更改的话.用户那里是否会连接不到这个数据表? 解决方案 解决方案二:你展示的时候连你本机的数据库还是用户的?你本机的就不用改连用户的话不要打包什么数据表直接备份一份你的数据库导入用户的数据库解决方案三:用户用什么数据库你的connection就用什么链接url,楼上说的不用打包数据库,备份导入就行了解决方

请教多线程操作同一个数据表时,怎么避免表死锁

问题描述 最近有一个数据采集的项目,要求可以多路并发,遇到多线程操作同一个数据表的问题,经常发生表死锁,求各位大侠帮忙,大约有20-40个进程实例化读取类,类中Receive方法接收数据并存储上代码publicclassclsTranslateObj{privatevoidReceive(){intlenReceive=0;byte[]receivedByte=newbyte[BUFFER_SIZE];//接收返回字节数组_rtnStr=string.Empty;while(_flgConnec

Java在HBase数据库中创建一个数据表的实例

要通过Java在HBase中创建一个数据表,首先需要导入hbase-client.jar驱动包.可以在项目pom.xml配置文件中添加依赖: <dependency>     <groupId>org.apache.hbase</groupId>     <artifactId>hbase-client<artifactId>     <version>1.1.0.1</version><dependency>

Oracle数据表中的死锁情况解决方法_oracle

在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定: 1.查找被锁定的表: select object_name,session_id,os_user_name,oracle_username,process,locked_mode,status from v$locked_object l, all_objects a where l.object_id=a.object_id; 如果想知道具体是哪

数据库添加数据-请教java后台向数据表添加数据总是失败问题

问题描述 请教java后台向数据表添加数据总是失败问题 其中customerid总是取到0, 在控制台输出的id也是有值的,怎么一添加到customerid 就变成0了? 解决方案 看你的代码是把id赋值给了变量lxr,而你最后一行代码crumCustomerService.add(crumCustomerlxr). 你最终要添加到数据库的记录是那个呢?如果是crumCustomerlxr的话,没看到赋值的地方啊. 建议你还是理理代码思路吧,我看你定义lxr是在循环外面,而循环里面每次都重新对l

Java数据对象(JDO)的前世今生

对象|数据 1 Java与数据库应用,JDBC Java发明以来,在短短的几年之间,迅速占领了从桌面应用(J2SE)到服务器(J2EE),再到小型设备嵌入式系统(J2ME)的应用开发市场,其语言吸取了SmallTalk的一切皆对象的理念,摆脱了C++的历史累赘,简洁.自由的风格赢得了很多开发者的喜爱.从JDK1.1开始,Java成为实用的语言,而不是被人观望的新品秀:再经过JDK1.2的大量增强(尤其是Collection Framework),JDK1.3的虚拟机效率提升(HotSpot),J

用JSP导出ORACLE的数据表DDL

js|oracle|数据 这几天忙着整理搞ISO的文档,也不知道自己维护的数据库手册是否齐全,算了干脆写个程序全给导出来算了:).下面的程序expddl.jsp可导出当前连接数据库的用户下的所有数据表的DDL. EXPDDL.JSP: <%@ page contentType="text/html; charset=gb2312" language="java" %><%@ page import = "java.sql.*"

Hibernate学习(一)使用SchemaExport生成数据表

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 今天就来演示一下Hibernate最初级的操作,使用SchemaExport创建数据表. 1.首先建立POJO类 package com.bjpowernode.hibernate; import java.util.Date; /** * 用户 * @author Longxuan * */ public class User { pri