`

jdbc -- PostgreSql死锁检测异常

 
阅读更多

 

在开发数据库JDBC程序程序时,如果出现死锁:

举例 :

 A线程开启事务

 B线程开启事务

  A  线程更新表 update table set name=? where id=1//--成功

  B   线程更新表 update table  set name=? where id=2//--成功

  ----------------A与B操作成功。

  A线程更新表 update table set name=? where id=2//这时由于id=2记录被B线程connection锁定,因此等待B 线程完成事      务,释放锁。

  B线程更新表 update table  set name=? where id=1//这时由于id=1记录被A线程connection锁定,因此等待A 线程完成事务,释放锁。

 

 即A线程与B线程都被阻塞,相互等待对象方释放锁,才能继续执行。

  因此 A线程与B线程的 数据库操作产生死锁。 

 

 死锁会导至两条线程都一直阻塞,connection连接被占用不释放,线程被占用不释放,id=1,id=2的两条记录被锁定,其它线程更新也会阻塞。

 

 

PostgreSQL 9.5.2 版本、JDBC版本:9.4:

能够检测到死锁,并使其中一个connection的sql执行抛出异常,另一个connection操作成功。 

 

jdbc 异常信息如下:

 

Caused by: org.postgresql.util.PSQLException: ERROR: deadlock detected
  详细:Process 21853 waits for ShareLock on transaction 74456083; blocked by process 21852.
Process 21852 waits for ShareLock on transaction 74456084; blocked by process 21853.
  建议:See server log for query details.
  在位置:while updating tuple (0,9) in relation "test_user"
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:420)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:413)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:493)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:45)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:73)
	at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
	at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:115)
	at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:170)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:386)

 

 PostgreSQL 能够检测死锁的前提是 两个connection 相互等待对象释放锁。 

 

 对于另一种情况:

    A启用事务

    B启用事务

    A connction 更新 update table set name =? where id=1 

         并且因为某种原因一直未提交事务,使id=1的记录一直被锁定

    B connection 更新update table set name =? where id=1 

         由于该记录被Aconnction锁定,B 一直等待Aconnection commit 或 rollback 来释放锁。 

    这样B 操作一直阻塞中。 

 

   这种情况 一个connection 一直等待另一个connection 释放锁,这种不是死锁,但会一直阻塞。

  解决办法 可以设置java.sql.Statement.setQueryTimeout(),来设置sql操作的超时时间,如果超时

则抛出异常,防止阻塞。 (前提是需要jdbc驱动支持)

    

分享到:
评论

相关推荐

    java数据库编程jdbc

    数据库是一个存储和管理数据的系统,常见的有MySQL、Oracle、SQL Server、PostgreSQL等。Java JDBC接口则提供了连接、查询、更新和管理这些数据库的方法。 1. **JDBC驱动类型**: JDBC驱动主要有四种类型: - ...

    PostgreSQL:SQL资源

    - 死锁检测与解决:PostgreSQL的死锁处理策略。 - MVCC(多版本并发控制):PostgreSQL的并发控制机制,允许多个事务同时读写数据。 4. **索引与性能优化** - 索引类型:B-Tree、GiST、SP-GiST、GIN和BRIN。 - ...

    spring boot tomcat jdbc pool的属性绑定

    - `driver-class-name`: 指定JDBC驱动类名,如`org.postgresql.Driver`用于PostgreSQL数据库。 - `url`: 数据库的连接URL,包含数据库地址、端口、名称等信息。 - `username` 和 `password`: 数据库的用户名和...

    JAVA数据库驱动大全(jar)

    - PostgreSQL:使用postgresql-jdbc.jar,完全用Java编写,支持JDBC 4.2标准。 - Microsoft SQL Server:使用mssql-jdbc.jar,由Microsoft官方提供,支持多种认证方式。 - SQLite:使用sqlite-jdbc.jar,轻量级且...

    2010-2011数据库系统期末考试题.docx

    JDBC 连接 PostgreSQL 数据库 #### 知识点解析: - **加载驱动**:在 Java 程序中,若要使用数据库,首先需要加载对应的 JDBC 驱动。对于 PostgreSQL 数据库,可以使用 `Class.forName("org.postgresql.Driver");`...

    C3P0连接池配置需要的jar包

    C3P0支持多种数据库,如MySQL、Oracle、PostgreSQL等,并且可以与JDBC驱动程序无缝集成。C3P0的一些关键特性包括自动检测并回收无效连接、连接测试策略、连接生命周期管理等。 2. **hibernate-c3p0-4.0.0.Final[1]....

    ssd7 ex9.zip_6RZ_SSD7 ex9_ssd7_ssd7-ex9

    PostgreSQL有内置的死锁检测机制来解决这类问题。 4. **Java编程**:MovieTransaction.java文件表明可能使用Java编程语言实现了与数据库交互的部分,如连接数据库、执行SQL语句等。这涉及到JDBC(Java Database ...

    Finding-consistency-in-an-inconsistent-data

    Java的异常处理机制(try-catch-finally)和死锁检测可以辅助我们在出现问题时及时恢复。 7. **Version Control**: 使用版本控制技术(如乐观锁、悲观锁或者MVCC多版本并发控制),可以在并发环境中控制数据的修改...

    c3p0-0.9.5.2.jar

    2. **自动管理连接**:它支持自动检测并回收死锁或失效的连接,以确保连接池中的每个连接都是有效的。同时,它还可以根据配置动态调整连接池的大小,以适应系统负载的变化。 3. **性能优化**:C3P0提供了一些高级...

    c3p0连接池

    2. 故障恢复:检测到连接异常时,C3P0可以尝试修复或替换,提高系统的健壮性。 3. 资源优化:通过连接复用,减少了数据库连接的创建和销毁,提高了系统效率。 4. 可扩展性:支持多种数据库,如MySQL、Oracle、...

    hibernate 详细配置

    该属性用于指定对应数据库的方言类,例如MySQL、Oracle、PostgreSQL等,这使得Hibernate可以生成针对特定数据库优化的SQL语句。例如,对于MySQL,可以设置为`org.hibernate.dialect.MySQLDialect`。 **2. hibernate...

    C++后端学习的技术栈

    - **ORM框架**:使用如SQLite、MySQL、PostgreSQL等数据库管理系统时,选择合适的ORM框架简化数据访问过程。 - **数据库连接池**:了解如何使用数据库连接池技术提高访问效率和响应速度。 #### 六、Web服务开发 - *...

    java数据库连接池-bonecp java源码

    8. **兼容性**:BoneCP兼容多种主流的JDBC驱动,可以方便地与MySQL、Oracle、PostgreSQL等数据库配合使用。 在使用BoneCP时,我们需要进行以下步骤: 1. 添加依赖:在项目中引入BoneCP的jar包或者Maven/Gradle的...

    各个公司java面试题

    此外,深入理解异常处理和垃圾回收机制也是必要的。 二、Java内存管理 Java的内存管理涉及到堆内存和栈内存的使用,以及对象的生命周期。面试中可能涉及的问题包括:何时发生内存分配和释放,了解新生代、老年代和...

    bonecp所有更新包

    5. **兼容性**:BoneCP支持多种主流的数据库,如MySQL、Oracle、PostgreSQL等,同时也兼容JDBC标准,使得它能应用于各种类型的Java项目。 最新更新的 BoneCP 包可能包含以下改进: - **性能优化**:可能针对特定...

    数据库连接池C3P0,jar包

    2. **自动检测与恢复**:C3P0会定期检查连接的有效性,如果发现死锁或其他问题,它可以自动回收并重新创建连接。 3. **事务管理**:C3P0支持自动提交和回滚事务,简化了事务处理流程。 4. **并发控制**:C3P0使用...

    0. 实验安排及实验内容1

    他们将了解并发控制机制,如锁、多版本并发控制(MVCC)以及死锁的预防和检测。 在完成这些实验后,学生应能独立完成实验报告,包括实验目标、内容、步骤、结果和总结,这有助于巩固理论知识,提升实践能力。实验...

    Common_Hold_Release_DB_Component

    - Java的JDBC API允许进行事务控制,此组件可能会封装这些功能,提供易于使用的事务开始、提交、回滚接口。 - 在多线程环境下,事务管理需要确保线程安全,防止并发问题,例如死锁。 3. **异常处理**: - 组件会...

    nomnom.lockjaw::locked_with_key:PG咨询锁作为组件

    5. **异常处理**:在可能出现异常的地方,确保有适当的清理逻辑以释放锁,防止死锁。 在压缩包文件`nomnom.lockjaw-master`中,可能包含`nomnom.lockjaw`项目的源代码、示例、文档和测试。通过查看源码,我们可以...

Global site tag (gtag.js) - Google Analytics