平台的路由应用需要读取一个表中的记录,优先读取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的了解不多,想不明白为什么这么一改就好了,先记着吧。
分享到:
相关推荐
- **SCAN IP 地址**:SCAN(Single Client Access Name)是Oracle RAC的一个特性,允许客户端通过一个或多个公共IP地址连接到任何集群节点。SCAN监听器应正常工作,确保高可用性。 - **VIP 地址**:Virtual IP(VIP...
本文档详细探讨了一个省级电信业务系统中,因频繁重启导致Oracle Real Application Clusters (RAC) 节点出现故障的情况。该系统在四套配置相同的RAC上运行,每套RAC均采用相同的主机版本、CRS(集群注册服务)和数据库...
Oracle 9i是Oracle数据库的一个重要版本,引入了许多新特性和改进。其中包括自动存储管理(Automatic Storage Management, ASM)、实时应用集群(Real Application Clusters, RAC)和数据仓库优化等。了解这些特性有...
- 登录到任意一个数据库服务器。 - 连接到DB Broker: ``` dgmgrl sys/xxxx@mmbsso ``` - 查看当前配置信息: ``` DGMGRL> show configuration verbose; ``` - 进行角色切换: ``` DGMGRL> switch over to ...
在对Oracle数据库进行日常维护时,涉及到的管理和检查项目十分丰富,包括对数据库状态的检查、日志文件的审核、对象状态的监控、性能的监控、安全性检查、Oracle RAC运行状态的监控以及一些其他必要检查等。...
"Oracle常见问题1000问chm合集"是一个珍贵的资源,尽管部分内容可能较为陈旧,但其中包含的问题解答仍然具有很高的参考价值,尤其对于初学者来说,可以帮助他们快速理解和解决在学习Oracle时遇到的困扰。 首先,让...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据重要地位。...每个章节都对应着一个压缩包中的文件,你可以按照顺序逐一学习,相信你会在Oracle的世界里找到自己的方向。
Oracle,作为全球最广泛应用的关系型数据库管理系统之一,其试题涵盖了数据库管理、SQL语言、性能优化、安全性等多个方面。以下是对这些知识点的详细解析: 1. **数据库管理**:这部分试题可能涉及Oracle数据库的...
Oracle9i是其在2001年发布的一个重要版本,全称为Oracle9i Database,它引入了许多新特性和性能优化,以增强数据存储、管理和处理的能力。这份"Oracle期末考试课件"显然是针对学习或教授Oracle9i课程的资源,旨在...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其9.2版本在当时是一个重要的里程碑,提供了许多新的特性和改进,对于DBA(数据库管理员)来说,理解和掌握这个版本的特性至关重要。 1. 数据库安装与配置...
- RAC(Real Application Clusters):了解Oracle的集群技术,实现多个实例共享同一数据库,提高服务连续性。 - Data Guard:利用物理和逻辑Standby数据库实现灾难恢复和高可用性。 8. **数据库设计与建模**: -...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据了重要的地位。这份"Oracle实操手册"涵盖了Oracle数据库管理、查询、优化等多个方面,对于学习和掌握Oracle技术具有很高的实用...
- 死锁:两个或更多事务相互等待对方释放资源,解决方法包括超时和死锁检测。 8. **数据库设计与规范化** - 实体关系模型:用于表示现实世界中的实体和它们之间的关系。 - 第一、二、三范式:规范数据库设计,...
综上所述,Oracle 10g性能分析与优化是一个涉及多方面的复杂过程,需要从SQL、数据库结构、内存、并发控制、监控工具、硬件和数据库设计等多个角度综合考虑,持续不断地调整和优化,才能实现Oracle数据库的最佳运行...
这些内容涵盖了Oracle9i基础和Oracle SQL的核心知识点,通过深入学习和实践,你可以成为一个熟练的Oracle数据库管理员或开发者。文件列表中的"Oracle9i基础XX.pdf"很可能包含了这些主题的详细讲解,可以逐个阅读以...
这一章将探讨Oracle的数据库复制技术,如Logical Standby、Dataguard等,以及Oracle Real Application Clusters(RAC)的原理和配置,以实现高可用性和负载均衡。 第十章:Oracle事务与并发控制 了解事务的概念,...
- JOIN操作:连接两个或多个表以获取相关数据。 - GROUP BY和HAVING:用于数据分组和条件过滤。 - WHERE和HAVING的区别:WHERE在GROUP BY之前筛选,HAVING在之后筛选。 - ORDER BY:对结果集进行排序。 - ...
《Oracle专家高级编程》是一本深入探讨Oracle数据库技术的专业书籍,专为已经具备一定Oracle基础知识并希望进一步提升技能的IT从业者或爱好者设计。该“超清文字版”提供了清晰易读的文本内容,允许读者方便地复制和...
Oracle数据库是全球最广泛使用的数据库管理系统之一,以其高效、稳定和功能强大著称。本课程“2011版李兴华主讲-ORACLE实战 最强大的数据库课程MLDN出品”由知名讲师李兴华主讲,旨在为学习者提供深入的Oracle实战...
- 检查数据库连接情况 - 检查系统磁盘空间 - 检查一些扩展异常的对象 - 检查system表空间内的内容 - 检查对象的下一扩展与表空间的最大扩展值 3. **检查Oracle数据库备份结果** - 检查数据库备份日志信息 - ...