`
epy
  • 浏览: 326048 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

连接RAC时出现的一个死锁异常

阅读更多

平台的路由应用需要读取一个表中的记录,优先读取SMS_ID比较小的记录;并且因为会有两个路由应用同时工作,为避免重复读取,需要在读取时锁定记录,读完后将这些记录删除;这就要用到Oracle中的select for update语句;排序后的记录无法使用for update子句;只好先用普通查询,用order by方式查出前N条记录的SMS_ID,得到结果中最大的SMS_ID,然后用  WHERE SMS_ID <= 最大值  for update 的方式锁定并获取相应的记录。

代码如下:  

Query query = session.createQuery("select s.smsId from " + entityName
						+ " s order by s.smsId");
List<BigDecimal> idlist = query.setMaxResults(rowNum).list();

//如果结果为空,说明表中没有记录,应直接返回。
if (idlist.size() == 0) {
	transaction.rollback();
	return null;
}

query = session.createQuery("from " + entityName
		+ " s where s.smsId <= ?");
query.setBigDecimal(0, idlist.get(idlist.size() - 1));
query.setLockMode("s", LockMode.UPGRADE);
dataList  = query.list();

 

在本机测试,两个应用同时开启,都工作正常,没有出现重复读取的现象,也没有出现任何异常。

部署到产品线后,两个路由应用却时不时抛出deadlock异常;流量越大的时候,出现deadlock的可能性越高,在运行了几天后的一个下午,两个路由应用都死掉了,导致数据大量积压。只开一个路由应用的话,不会出现deadlock异常。

奇怪是在本机测试时,不管压上多少的流量,都不会出现这个异常;找数据库的DBA拿日志,由于日志被删掉,不会再生成,就拿不到死锁的日志,DBA提到可能是问题源于本机测试连的是单数据库,而产品线上连得是采用RAC的两个数据库,两个数据库操作相同的数据;在产品线上可能一个路由通过某个数据库锁定记录,而另一个应用通过另一个数据库锁定记录,比连单数据库的情况要复杂些;可能是这种复杂性导致本机没有问题的操作在产品线上却抛出deadlock异常。

没有拿到日志,搞不清楚是怎么死锁的,只好进行尝试;可以采取的方案的有

1. 同事提出的过滤条件不用 SMS_ID <= 最大值,而是用 SMS_ID in (),这样也许能更精确控制锁定的记录;修改后的代码如下 

query = session.createQuery("from " + entityName
						+ " s where s.smsId in (:ids) ");
query.setParameterList("ids", idlist);
query.setLockMode("s", LockMode.UPGRADE);
dataList  = query.list()

 

2. 采用原生SQL,在for update后面加上skip locked,这样会话在锁定记录时,即使有些记录已经被其他会话锁定,也不会阻塞,直接跳过被锁定的记录,返回满足过滤条件的未锁定记录;不会阻塞,应该就不会发生死锁;修改后的代码如下

String tableName = HibernateSessionFactory.getTableName(entityName);
SQLQuery sqlQuery = session.createSQLQuery("select * from " + tableName 
		+ " where SMS_ID <= ? for update skip locked");
sqlQuery.setBigDecimal(0, idlist.get(idlist.size() - 1));
sqlQuery.addEntity(entityName);
dataList  = sqlQuery.list();

 

 

先采用第一个方案,到产品线上测试,发现两个应用就不再抛出deadlock异常;既然问题解决了,就没有到产品线上测试第二个方案,毕竟产品线不是测试机。

    对RAC的了解不多,想不明白为什么这么一改就好了,先记着吧。

分享到:
评论

相关推荐

    ORACLE RAC数据库巡检表

    - **SCAN IP 地址**:SCAN(Single Client Access Name)是Oracle RAC的一个特性,允许客户端通过一个或多个公共IP地址连接到任何集群节点。SCAN监听器应正常工作,确保高可用性。 - **VIP 地址**:Virtual IP(VIP...

    由重启引起的Oracle RAC节点宕机分析及追根溯源.docx

    本文档详细探讨了一个省级电信业务系统中,因频繁重启导致Oracle Real Application Clusters (RAC) 节点出现故障的情况。该系统在四套配置相同的RAC上运行,每套RAC均采用相同的主机版本、CRS(集群注册服务)和数据库...

    oracle9iocp考试官方教材学习指南

    Oracle 9i是Oracle数据库的一个重要版本,引入了许多新特性和改进。其中包括自动存储管理(Automatic Storage Management, ASM)、实时应用集群(Real Application Clusters, RAC)和数据仓库优化等。了解这些特性有...

    (绝对干货)Oracle ADG数据库完整部署、切换、备份、运维手册

    - 登录到任意一个数据库服务器。 - 连接到DB Broker: ``` dgmgrl sys/xxxx@mmbsso ``` - 查看当前配置信息: ``` DGMGRL&gt; show configuration verbose; ``` - 进行角色切换: ``` DGMGRL&gt; switch over to ...

    Oracle数据库日常维护手册v1.8.pdf

    在对Oracle数据库进行日常维护时,涉及到的管理和检查项目十分丰富,包括对数据库状态的检查、日志文件的审核、对象状态的监控、性能的监控、安全性检查、Oracle RAC运行状态的监控以及一些其他必要检查等。...

    Oracle 常见问题1000问 chm 合集.rar

    "Oracle常见问题1000问chm合集"是一个珍贵的资源,尽管部分内容可能较为陈旧,但其中包含的问题解答仍然具有很高的参考价值,尤其对于初学者来说,可以帮助他们快速理解和解决在学习Oracle时遇到的困扰。 首先,让...

    巨实用的Oracle学习手册

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据重要地位。...每个章节都对应着一个压缩包中的文件,你可以按照顺序逐一学习,相信你会在Oracle的世界里找到自己的方向。

    公司的Oracle试题

    Oracle,作为全球最广泛应用的关系型数据库管理系统之一,其试题涵盖了数据库管理、SQL语言、性能优化、安全性等多个方面。以下是对这些知识点的详细解析: 1. **数据库管理**:这部分试题可能涉及Oracle数据库的...

    Oracle期末考试课件

    Oracle9i是其在2001年发布的一个重要版本,全称为Oracle9i Database,它引入了许多新特性和性能优化,以增强数据存储、管理和处理的能力。这份"Oracle期末考试课件"显然是针对学习或教授Oracle9i课程的资源,旨在...

    Ora92 DBA手册

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其9.2版本在当时是一个重要的里程碑,提供了许多新的特性和改进,对于DBA(数据库管理员)来说,理解和掌握这个版本的特性至关重要。 1. 数据库安装与配置...

    Oracle数据库应用技巧专题

    - RAC(Real Application Clusters):了解Oracle的集群技术,实现多个实例共享同一数据库,提高服务连续性。 - Data Guard:利用物理和逻辑Standby数据库实现灾难恢复和高可用性。 8. **数据库设计与建模**: -...

    oracle实操手册

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据了重要的地位。这份"Oracle实操手册"涵盖了Oracle数据库管理、查询、优化等多个方面,对于学习和掌握Oracle技术具有很高的实用...

    Oracle开发笔记

    - 死锁:两个或更多事务相互等待对方释放资源,解决方法包括超时和死锁检测。 8. **数据库设计与规范化** - 实体关系模型:用于表示现实世界中的实体和它们之间的关系。 - 第一、二、三范式:规范数据库设计,...

    Oracle.10g性能分析与优化思路

    综上所述,Oracle 10g性能分析与优化是一个涉及多方面的复杂过程,需要从SQL、数据库结构、内存、并发控制、监控工具、硬件和数据库设计等多个角度综合考虑,持续不断地调整和优化,才能实现Oracle数据库的最佳运行...

    Oracle9i基础

    这些内容涵盖了Oracle9i基础和Oracle SQL的核心知识点,通过深入学习和实践,你可以成为一个熟练的Oracle数据库管理员或开发者。文件列表中的"Oracle9i基础XX.pdf"很可能包含了这些主题的详细讲解,可以逐个阅读以...

    oracle基础教程

    这一章将探讨Oracle的数据库复制技术,如Logical Standby、Dataguard等,以及Oracle Real Application Clusters(RAC)的原理和配置,以实现高可用性和负载均衡。 第十章:Oracle事务与并发控制 了解事务的概念,...

    oracle数据库面试题目汇总及答案解析.zip

    - JOIN操作:连接两个或多个表以获取相关数据。 - GROUP BY和HAVING:用于数据分组和条件过滤。 - WHERE和HAVING的区别:WHERE在GROUP BY之前筛选,HAVING在之后筛选。 - ORDER BY:对结果集进行排序。 - ...

    Oracle专家高级编程-超清文字版

    《Oracle专家高级编程》是一本深入探讨Oracle数据库技术的专业书籍,专为已经具备一定Oracle基础知识并希望进一步提升技能的IT从业者或爱好者设计。该“超清文字版”提供了清晰易读的文本内容,允许读者方便地复制和...

    2011版李兴华主讲-ORACLE实战 最强大的数据库课程MLDN出品—oracle课堂笔记(全).rar

    Oracle数据库是全球最广泛使用的数据库管理系统之一,以其高效、稳定和功能强大著称。本课程“2011版李兴华主讲-ORACLE实战 最强大的数据库课程MLDN出品”由知名讲师李兴华主讲,旨在为学习者提供深入的Oracle实战...

    大型企业公司OracleDBA维护和点检手册.pdf

    - 检查数据库连接情况 - 检查系统磁盘空间 - 检查一些扩展异常的对象 - 检查system表空间内的内容 - 检查对象的下一扩展与表空间的最大扩展值 3. **检查Oracle数据库备份结果** - 检查数据库备份日志信息 - ...

Global site tag (gtag.js) - Google Analytics