避免死锁的通常建议是始终以相同的顺序锁定资源.但是,对于高度满足的Oracle数据库中的行锁,您将如何实现这一点?

要了解我的意思,请考虑以下示例.一个非常简单的DAO来处理银行账户:

@Component

public class AccountDao {

@Resource

private DataSource dataSource;

public void withdraw(String account, int amount) {

modifyBalance(account, -amount);

}

public void deposit(String account, int amount) {

modifyBalance(account, amount);

}

private void modifyBalance(String account, int amount) {

try {

Connection connection = DataSourceUtils.getConnection(dataSource);

PreparedStatement statement = connection

.prepareStatement("update account set balance = balance + ? where holder = ?");

statement.setInt(1, amount);

statement.setString(2, account);

statement.execute();

}

catch (SQLException e) {

throw new RuntimeException(e);

}

}

}

要在两个帐户之间执行传输,有一种具有传输方法的InternalBankTransfer类:

public void transfer(String from, String to, int amount) {

// start transaction

accountDao.withDraw(from, amount);

accountDao.deposit(to, amount);

// commit transaction

}

通常这很好.但是,假设我们有两个人同时启动转账.让我们说安妮想要在鲍勃想要将50转移到安妮的同时向鲍勃转移100美元.因此在一个线程中,Anne调用transfer(“Anne”,“Bob”,100),而另一个Bob调用transfer(“Bob”,“Anne”,50).如果执行顺序如下,则此代码容易受到死锁的影响:

T1: accountDao.withDraw("Anne", 100);

T2: accountDao.withDraw("Bob", 50);

T1: accountDao.deposit("Bob", 100);

T2: accountDao.deposit("Anne", 50); // BAM! ORA-00060: deadlock detected while waiting for resource

我承认在我开始在实际应用程序中看到死锁之前我根本没有考虑过这个问题.我天真的看法是事务隔离类型自动处理这个问题.甲骨文表示,这是由于应用程序设计不佳造成的.但在这种情况下,什么是好的设计呢?我是否需要选择更新我计划更新的所有内容?如果这是涉及更新多个表的巨大事务怎么办?我应该设计使死锁不可能或只是最小化它们并接受they are a fact of life?

java超时导致oracle锁表_java – 正确的设计,以避免Oracle死锁?相关推荐

  1. Oracle锁表解决方法的详细记录详解

    一淘模板网给大家带来了关于Oracle的相关知识,在开发Oracle数据库时,我们常遇到频繁操作的Oracle数据表,会出现Oracle锁表,下面给大家介绍了关于Oracle锁表解决方法的相关资料,希 ...

  2. oracle锁表导致update,delete,insert出现无反应的问题

    java项目中遇到更新,删除等操作无反应的问题,但后台却不报错,也能正确打印sql语句.最终发现是oracle锁表导致的. 解决方法: 1.查询oracle数据库被锁的表 SELECT T1.ORAC ...

  3. ORACLE锁表解决办法

    ORACLE锁表解决办法 [61000][54] ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 报错原因:对表的操作短时间内太过快速和频繁而导致的数据库锁表. ...

  4. Oracle锁表 行级锁 表级锁 行级锁

    2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行       ...

  5. oracle 锁表查询和解表操作

    数据库操作语句的分类 DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:Insert.delete.update DCL:数据库控制语言 ,关键字:grant.remov ...

  6. oracle未提交锁表,解决ORACLE锁表问题

    转载备用 在ORACLE操作中经常会发生,尚未提交(或回滚)数据Session异常关闭的情况 会导致表中的某些数据被锁死. 解决办法是用sys登录后,先找出lock的Session. select o ...

  7. oracle update 锁表还是锁行,for update造成的Oracle锁表与解锁

    我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...

  8. 怎么操作会导致MySQL锁表

    怎么操作会导致MySQL锁表 转载于:https://www.cnblogs.com/luao/p/10867785.html

  9. oracle锁表怎么解决,Oracle锁表问题的简捷处理技巧

    在开发Oracle数据库时,我们常遇到频繁操作的Oracle数据表,会出现Oracle锁表.现在就针对这一问题,提下个人的解决Oracle锁表的技巧. 首先问题分析: (1)锁的分析 ORACLE里锁 ...

最新文章

  1. 中国互联网+光通信器件行业商业模式创新与投资机会深度研究报告
  2. 基于反向代理的Web缓存应用-可缓存的CMS系统设计
  3. c语言读取一个图像文件格式,求指导,如何用c语言实现读取*.raw格式图像
  4. 学会python编程容易吗-Python 适合初学编程的人学吗?
  5. c# 中Stopwatch 类的运用
  6. linux与windows双系统保持时间同步
  7. P3168-[CQOI2015]任务查询系统【主席树】
  8. angular学习的一些小笔记(中)之ng-disabled轻松实现按钮是否可点击状态
  9. CSDN 勤写标兵勋章 颁发规则
  10. python中numpy matplotlib绘图教程_利用numpy+matplotlib绘图的基本操作教程
  11. SpringMvc 文件上传后台处理
  12. 一周最新示例代码回顾 (4/23–4/29)
  13. 计算机解决的气象复杂问题,自动气象站更换时计算机遇到的疑难问题及解决办法...
  14. 借助 Clay 编写 不可思议 的 c# 代码
  15. python实现对某招聘网接口测试获取平台信息
  16. Mysql中使用IF
  17. onreadystatechange 事件
  18. java 区分中英文_Java 区分文本中的中英文字符函数
  19. Flash 0day漏洞(CVE-2018-5002)千万不要乱打开Excel文档!
  20. J2EE重要的技术架构图

热门文章

  1. 【Linux】26_文件服务FTP Server
  2. Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
  3. Mysql数据库存储引擎--转
  4. 探索 ConcurrentHashMap 高并发性的实现机制--转
  5. Lesson 13.4 Dead ReLU Problem与学习率优化
  6. 孙正义看未来30年:投资趋势,永远不会错
  7. AI开发学习: 第一款AI药物诞生:英国公司“光速”制药碾压传统研发
  8. 为什么以太坊不仅仅是一个加密货币
  9. java time 周期性执行,详解ScheduledExecutorService的周期性执行方法
  10. MyBatis源码-深入理解MyBatis Executor的设计思想