`
epy
  • 浏览: 324657 次
  • 性别: 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的了解不多,想不明白为什么这么一改就好了,先记着吧。

分享到:
评论

相关推荐

    维护RAC时关闭部分资源

    维护RAC时关闭部分资源 维护RAC时关闭部分资源

    weblogic连接oracle RAC数据源配置

    NULL 博文链接:https://shikonglaike.iteye.com/blog/543538

    oracle_RAC英文版

    RAC是oracle的一个软件结构,将数据库files存放在物理或是逻辑上连接每个节点的磁盘上。RAC软件管理着数据的访问,更改操作在Instances之间是被相互协调的,以便于每个节点上活动的Instance都可以对files进行读写...

    Oracle 11GR2 RAC-RAC DG 环境部署手册

    浦东机场货运站核心数据库升级至Oracle RAC 11gR2。操作系统采用RedHat Enterprice Linux 6.3 x64,操作系统平台为x86-64。 Oracle网格管理器和...主RAC和备RAC各2个节点,2套RAC采用Active Data Guard做实时同步。

    ORACLE 数据库RAC环境DG主备不同步问题处理.docx

     操作系统:Red Hat Enterprise Linux ...发现备库(单实例)与主库不同步,检查发现日志中断了好长时间,由于之前主库出现过归档空间不足的情况,手动清除了归档,导致缺少日志同步不过去,一直显示等待6392号归档:

    Oracle_RAC汇总

    ORACLE RAC原理在一个应用环境当中,所有的服务器使用和管理同一个数据库,目的是为了分散每一台服务器的工作量,硬件上至少需要两台以上的服务器,而且还需要一个共享存储设备。同时还需要两类软件,一个是集群软件...

    Oracle 19c CDB RAC To RAC ActiveDataguard部署方案

    Oracle 19c CDB RAC To RAC ActiveDataguard部署方案

    win2012 部署oracle12c rac+iscsi 连接存储.docx

    本文详细介绍在Windows系统上通过iscsi 连接存储共享模式,部署安装oracle 12c rac asm模式,适合新手练习!如有疑问,可留言!

    Oracle19c RAC+ RACDG配置详细部署文档

    1,Oracle19c RAC+ RACDG配置详细部署文档 2,Oracle19c RAC+ RACDG+racdg2配置详细部署文档 涉及主库备库参数配置、spfile、crs资源配置更新及实施过程中故障排除等; 来自于现实上亿级生产系统的实操记录。

    oracle 11g rac 虚拟机搭建集群

    RAC是一个完整的集群应用环境,它不仅实现了集群的功能,而且提供了运行在集群之上的应用程序,即Oracle数据库。无论与普通的集群相比,还是与普通的oracle数据库相比,RAC都有一些独特之处。 RAC由至少两个节点组成...

    oracle_rac

    RAC 是一个软件可以使你通过运行多个依赖相同 Database 的 Instance,使 用 Cluster 硬件。数据库 files 被存放在物理或是逻辑上连接每个节点的磁盘上。 以便于每个活动的 Instance 都可以对 files 进行读写操作。 ...

    Oracle RAC重启操作手册

    这个文档详细的记录了重启Oracle rac的每一个步骤,重启的方法很多,这个可能不是最适合你的,但这个是有效的,这个文档是我给外行看的

    OracleRAC名词解释及日常管理

    RAC能够通过后台的监控进程将连接自动切换到另外一个或多个节点上,从而实现应用的无缝切换,对实例的高可用提供保护。  因此,我们也能够得出结论,RAC保护的是实例,而并非数据,这点一定要明确(对数据进行冗余的...

    oracle rac防火墙配置学习

    Linux 常用命令 oracle rac 中文手册 官网翻译 oracle rac

    一步一步在Linux上升级 Oracle 10gR2 RAC到11gR2 RAC

    为更贴切还原生产过程中的实际操作,本系列教程一个分两大部分: 第一部分已发 一步一步在Linux上部署Oracle 10g R2 RAC! 第二部分,一步一步将10gR2 RAC 升级至Oracle 11gR2 RAC,数据库版本选择Oracle 11g最新...

    VMWARE虚拟机下安装Oracle 11g_RAC

    在 Oracle 11gR2 之前,client 链接数据库的时候要用 vip,假如 cluster 有 4 个节点,那么客户端的 tnsnames.ora 中就对应有四个主机 vip 的一个连接串,如果 cluster 增加了一个节点,那么对于每个连接数据库的客户端都...

    rac to rac dataguard setup in 11.2.0.4

    文章描述如何设置oracle 11.2.0.4 的 RAC to RAC dataguard.

    Oracle_RAC安装配置指导书

    RAC 与 OPS 之间的一个较大区别是,RAC采用了Cache Fusion(高速缓存合并)技术。在 OPS 中,节点间的数据请求需要先将数据写入磁盘,然后发出请求的节点才可以读取该数据。使用Cache fusion时,RAC的各个节点的数据...

Global site tag (gtag.js) - Google Analytics