【发布时间】:2011-06-19 22:41:12
【问题描述】:
最近我有一个任务,根据这个任务,我需要一个特定的锁定功能。具体是由于:
- 正在更新的事务 桌子是分发的,所以我没有 控制它,
- 白天 数千个非阻塞事务 必须同时支持, 让我们称它们为“一般”操作,
- 每个“常规”操作都会更新特定“分支”(“LDN”、“NY”、“LA”...)上的行,
- 一天有一个“主人” 每个分支的操作,这些操作在不同的分支上大量发生,
- “主”操作期间无 该分支上的“一般”操作可能会发生。
- 当“主”操作启动时 必须等待当前的“将军” 对提供的分支完成操作, 在“主”操作到达之前就在系统中。
- 在特定分支上的“主”处理期间,所有其他分支都可以 已更新。
为了存档,我创建了 Oracle DB 特定表
create table BRANCH_LOCK(
BRANCH VARCHAR2(10),
FLAG VARCHAR2(1),
CONSTRAINT "PK_BRANCH_LOCK" PRIMARY KEY ("BRANCH")
)
支持以下不同操作的功能:
对于“一般”操作:
1. In the same XA transaction each operation locks BRANCH_LOCK table in SHARE mode, 2. After locking it checks FLAG, on updated branch, 1. If flag is 'Y', that means that currently 'master' operation is in progess, so Exception is thrown, and no further processing is done; 2. If flag is 'N' than everything is OK, and general processing is done;
对于“主”操作:
- 当“主”操作到来时,我开始单独的事务,其中:
- 在 EXCLUSIVE 模式下锁定 BRANCH_LOCK 表,当在不同事务中此表上存在 SHARE 模式 LOCK 时,无法获取该事务(这样,我保证在所有当前的“一般”操作完成后,“主”操作将开始,虽然它等待所有分支上的交易 完成,不仅指定一个),
- 将分支标志设置为“Y” (这样,我保证在“master”时不会有“general”交易 运算处理),
- 在传入事务中,我将表中的标志更改为“N”,因此在 它提交 BRANCH_LOG 表将有 FLAG 列中的适当值,系统将 能够处理“一般” 再次操作。
这还没有投入生产,所以我想知道有没有更好的解决方案, 除了上面描述的还有什么缺点吗?
一些我没有提到的更新:
- 'master' 操作对'general' 操作的结果起作用,因此在'master' 处理期间没有'general' 操作丢失是至关重要的,所以这就是为什么当前'general' 操作必须在 master 之前完成操作开始处理。
- 同一分支上的多个“常规”操作每秒发生一次,大约每秒 3000 次操作,
- 分支只能发生一个“主”操作,可以同时处理不同分支上的多个“主”操作。
【问题讨论】:
-
我不清楚你的观点 (1)。它被分发与你是否可以控制它有什么关系?另外,这是指一般操作还是主操作?
-
您暗示但没有直接声明,同一分支上的多个常规操作可以同时工作。对吗?
-
关于 cmets。关于第 1 点,所有操作 general 和 master 都是分布式的,所以我不知道事务何时开始,何时提交或回滚,在这个时间点我无法控制。关于一般操作,在支持的同一分支上必须每秒有 3'000 操作,所以是的,一个分支同时有多个操作,同时发生。
标签: oracle transactions locking distributed xa