在开发数据库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驱动支持)
相关推荐
数据库是一个存储和管理数据的系统,常见的有MySQL、Oracle、SQL Server、PostgreSQL等。Java JDBC接口则提供了连接、查询、更新和管理这些数据库的方法。 1. **JDBC驱动类型**: JDBC驱动主要有四种类型: - ...
- 死锁检测与解决:PostgreSQL的死锁处理策略。 - MVCC(多版本并发控制):PostgreSQL的并发控制机制,允许多个事务同时读写数据。 4. **索引与性能优化** - 索引类型:B-Tree、GiST、SP-GiST、GIN和BRIN。 - ...
- `driver-class-name`: 指定JDBC驱动类名,如`org.postgresql.Driver`用于PostgreSQL数据库。 - `url`: 数据库的连接URL,包含数据库地址、端口、名称等信息。 - `username` 和 `password`: 数据库的用户名和...
- PostgreSQL:使用postgresql-jdbc.jar,完全用Java编写,支持JDBC 4.2标准。 - Microsoft SQL Server:使用mssql-jdbc.jar,由Microsoft官方提供,支持多种认证方式。 - SQLite:使用sqlite-jdbc.jar,轻量级且...
JDBC 连接 PostgreSQL 数据库 #### 知识点解析: - **加载驱动**:在 Java 程序中,若要使用数据库,首先需要加载对应的 JDBC 驱动。对于 PostgreSQL 数据库,可以使用 `Class.forName("org.postgresql.Driver");`...
C3P0支持多种数据库,如MySQL、Oracle、PostgreSQL等,并且可以与JDBC驱动程序无缝集成。C3P0的一些关键特性包括自动检测并回收无效连接、连接测试策略、连接生命周期管理等。 2. **hibernate-c3p0-4.0.0.Final[1]....
PostgreSQL有内置的死锁检测机制来解决这类问题。 4. **Java编程**:MovieTransaction.java文件表明可能使用Java编程语言实现了与数据库交互的部分,如连接数据库、执行SQL语句等。这涉及到JDBC(Java Database ...
Java的异常处理机制(try-catch-finally)和死锁检测可以辅助我们在出现问题时及时恢复。 7. **Version Control**: 使用版本控制技术(如乐观锁、悲观锁或者MVCC多版本并发控制),可以在并发环境中控制数据的修改...
2. **自动管理连接**:它支持自动检测并回收死锁或失效的连接,以确保连接池中的每个连接都是有效的。同时,它还可以根据配置动态调整连接池的大小,以适应系统负载的变化。 3. **性能优化**:C3P0提供了一些高级...
2. 故障恢复:检测到连接异常时,C3P0可以尝试修复或替换,提高系统的健壮性。 3. 资源优化:通过连接复用,减少了数据库连接的创建和销毁,提高了系统效率。 4. 可扩展性:支持多种数据库,如MySQL、Oracle、...
该属性用于指定对应数据库的方言类,例如MySQL、Oracle、PostgreSQL等,这使得Hibernate可以生成针对特定数据库优化的SQL语句。例如,对于MySQL,可以设置为`org.hibernate.dialect.MySQLDialect`。 **2. hibernate...
- **ORM框架**:使用如SQLite、MySQL、PostgreSQL等数据库管理系统时,选择合适的ORM框架简化数据访问过程。 - **数据库连接池**:了解如何使用数据库连接池技术提高访问效率和响应速度。 #### 六、Web服务开发 - *...
8. **兼容性**:BoneCP兼容多种主流的JDBC驱动,可以方便地与MySQL、Oracle、PostgreSQL等数据库配合使用。 在使用BoneCP时,我们需要进行以下步骤: 1. 添加依赖:在项目中引入BoneCP的jar包或者Maven/Gradle的...
此外,深入理解异常处理和垃圾回收机制也是必要的。 二、Java内存管理 Java的内存管理涉及到堆内存和栈内存的使用,以及对象的生命周期。面试中可能涉及的问题包括:何时发生内存分配和释放,了解新生代、老年代和...
5. **兼容性**:BoneCP支持多种主流的数据库,如MySQL、Oracle、PostgreSQL等,同时也兼容JDBC标准,使得它能应用于各种类型的Java项目。 最新更新的 BoneCP 包可能包含以下改进: - **性能优化**:可能针对特定...
2. **自动检测与恢复**:C3P0会定期检查连接的有效性,如果发现死锁或其他问题,它可以自动回收并重新创建连接。 3. **事务管理**:C3P0支持自动提交和回滚事务,简化了事务处理流程。 4. **并发控制**:C3P0使用...
他们将了解并发控制机制,如锁、多版本并发控制(MVCC)以及死锁的预防和检测。 在完成这些实验后,学生应能独立完成实验报告,包括实验目标、内容、步骤、结果和总结,这有助于巩固理论知识,提升实践能力。实验...
- Java的JDBC API允许进行事务控制,此组件可能会封装这些功能,提供易于使用的事务开始、提交、回滚接口。 - 在多线程环境下,事务管理需要确保线程安全,防止并发问题,例如死锁。 3. **异常处理**: - 组件会...
5. **异常处理**:在可能出现异常的地方,确保有适当的清理逻辑以释放锁,防止死锁。 在压缩包文件`nomnom.lockjaw-master`中,可能包含`nomnom.lockjaw`项目的源代码、示例、文档和测试。通过查看源码,我们可以...