一段不知道会不会导致死锁的代码

问题描述

问题是这样的,目前有个应用,平时没有问题,但极少数情况下会抛出数据库死锁的异常,我怀疑有可能是并发操作的时候出现,检查之后定位到这一段执行update的语句,请帮忙看看,有没有可能导致死锁调用这个方法的是methodA,methodA中先把Autocommit设为false,然后循环调用executeUpdate(String sql),因为可能会有多条sql需要执行,最后commit,再回复Autocommit为trueexecuteUpdate(String sql)的代码如下public int executeUpdate(String sql) throws SQLException { //LogUtil.getLogger().debug("SQL [" + sql + "]");stmt = conn.createStatement();int count = stmt.executeUpdate(sql);if(stmt != null){ stmt.close(); } return count;}有个需要说明的是methodA和executeUpdate都在同一个类中,Connection conn和Statement stmt都是全局的,会不会是stmt创建的时候出的问题,是否需要加上synchronized 问题补充:rocketball 写道

解决方案

我说错了,加上synchronized就可以了
解决方案二:
数据库对于这种情况的死锁是能自己发现的,然后退出一个
解决方案三:
给你几个解决方法。1.死锁发生时查询数据库分析死锁具体原因.2.记录日志知道死锁具体位置.3.进行数据库操作时设定超时时间,避免等待。
解决方案四:
数据库有一个默认的事务级别,像PostGreSQL的默认级别是Read_Committed。像你这样的写法,如果有多条语句同时对行A进行修改:SQL1:Update A 这时还没有Commit,所有A有行级锁SQL2:Update A SQL2是无法被修改的,因为A有行级锁你这种情况加synchronized是没用的。stmt = conn.createStatement(); int count = stmt.executeUpdate(sql); if(stmt != null){ stmt.close(); } 你在Commit前不要去执行stmt.close(); 语句。

时间: 2024-09-16 05:13:13

一段不知道会不会导致死锁的代码的相关文章

管理系统-这段不知道出啥问题了,总之输出的内容永远少个开头

问题描述 这段不知道出啥问题了,总之输出的内容永远少个开头 #include#include#include#includestruct book{int num;char name[30];char add[30];};book b[10]={ {0glory""D:1234.txt""} {1make""D:123.txt""} {2overload""D:1233.txt""} {

sqlserver2008-各位大神,请问sql的两个事务中的select如何能导致死锁

问题描述 各位大神,请问sql的两个事务中的select如何能导致死锁 捕获的trace日志非常大,我先放下出错的两条语句. sqlserver profiler捕获的是这样一条错误. 我想知道的是明明是两条select,S锁为何会导致死锁.而且死锁图形中的的排它锁是怎么回事,明明对keeping的这个资源没有update,只有delete,delete也会增加排它锁吗?行级的,还是表级的,为何我在prfiler中 捕获update或者delete时mode列没有提示锁? 问的有点多,请先看下图

MySQL Innodb表导致死锁日志情况分析与归纳_Mysql

案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志.两个sql语句如下:(1)insert into backup_table select * from source_table(2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<'$daysago_1week'teamUser表的表结构如下:PRIMARY

进程间共享内存 由于某个进程异常退出导致死锁

解决Nginx和Fpm-Php等内部多进程之间共享数据问题 概念说明: 1. MINIT:Php扩展的初始化方法,整个模块启动时候被调用一次 2. RINIT:Php扩展的初始化方法,每个请求会调用一次 3. ClusterMap(简称CM):提供服务定位和集群地图功能,通过接收心跳和主动探测方式收集节点状态信息,统一管理多种异构集群,替换硬负载均衡设备 4. CMSubProxy:ClusterMap内部的一个订阅者客户端代理,定期和Server端通讯,获取最新的集群信息,更新内部维护的机器列

httpwebrequest-C# WPF求高手指点这段怎么解决假死?求具体代码

问题描述 C# WPF求高手指点这段怎么解决假死?求具体代码 public WebResponse Web(url) { WebResponse re; HttpWebRequest resq = (HttpWebRequest)WebRequest.Create(url); re = resq.GetResponse(); return re; } 解决方案 其实可以建个线程来执行这一步,或者你自己设定个超时报异常,毕竟假死本来就是性能问题 解决方案二: 这种假死的情况可能的原因是:网速原因,

求一段可以打印哈夫曼树的代码,能够在执行时看到的,谢谢!!

问题描述 求一段可以打印哈夫曼树的代码,能够在执行时看到的,谢谢!! 求一段可以将我写的哈夫曼树打印出来的代码,谢谢!!我正在写一个huffman的编码和译码的程序可是不会写打印的,请大家帮忙 解决方案 http://blog.csdn.net/creazyapple/article/details/7948207http://blog.csdn.net/skyline0623/article/details/6023443 解决方案二: 注意调用方法,把指向树的指针传给第二个函数: void

Waiting Auto-INC LOCK导致死锁

今天下午在看死锁相关的文档,到线上查看一生产数据库的时候,正好发现了show engine innodb status有一个死锁的信息: LATEST DETECTED DEADLOCK ------------------------ 120626 20:00:30 *** (1) TRANSACTION: TRANSACTION 3 3052385643, ACTIVE 0 sec, process no 3898, OS thread id 1356507456 inserting mys

解释一段在光标位置插入字符的js代码

js|插入|光标 这篇小文本来应该在昨天发的,但是由于我昨天敲错了一个键(就是IBM笔记本键盘上的前进后退),导致文章丢失...今天就简写了.网络上有许多能在光标位置插入字符的js代码,比较啰嗦,不适合讲解.我写了一段简单的代码,解释一下: 1234567 <FORM> <TEXTAREA NAME="a" ONSELECT="this.pos=document.selection.createRange();"  onKEYUP="th

如何定位导致Crash的代码位置

1. 在开发环境下定位Crash错误 1.1 普通的crash 1.2 较难定位的crash 1.3 注意vc的输出日志 2. 定位发布在外的版本的Crash错误 3. 小技巧 3.1 根据程序地址找到代码位置 3.2 根据消息值查看对应的windows消息 3.3 查看GetLastError返回值 3.4 在代码中暂停程序 4. 编程小警示 4.1 慎用IsBadPtr系列函数 4.2 慎用catch(...) 5. 附录 5.1 为什么程序crash时调用堆栈是乱的 5.2 使用Debug