我们有一个高事务性,高并发java系统访问存储在Oracle 11.g实例上的数据。我们的系统部署在多个Websphere 8.5应用服务器上。 对数据的并发访问由在不同线程中运行的不同事务进程执行。
请考虑下表,其记录应遵循以下规则处理:
ID BUSINESS_ID
==============
1 1
2 1
3 2
4 1
5 3
6 3
7 2
要创建测试数据,您可以运行以下命令:
create table test (id number, business_id number);
insert into test values (1, 1);
insert into test values (2, 1);
insert into test values (3, 2);
insert into test values (4, 1);
insert into test values (5, 3);
insert into test values (6, 3);
insert into test values (7, 2);
commit;
要模拟三个线程,您可以为每个线程打开一个单独的数据库会话。在这种情况下,处理流程可能如下所示:
我的想法是使用SELECT FOR UPDATE来标记要处理的记录,以及何时完成工作以删除并提交所选记录。
使用存储过程实现此逻辑将起作用,但我们的方法是将业务逻辑保留在Java代码中的中间层级而不是数据库级别。
您是否可以通过运行SQL而不是在存储过程中实现它来看到实现此目的的方法?
因此,简而言之,我所拥有的是具有最小ID的记录的SELECT FOR UPDATE,其中BUSINESS_ID不属于该表中任何其他锁定记录。
提前谢谢