【发布时间】:2014-09-19 21:59:24
【问题描述】:
假设我需要对可能同时发生的数据存储实体执行两种不同类型的写入操作,例如:
- 对条目持有写锁的客户端会更新条目的内容
- 客户端请求刷新写锁(更新锁的过期时间戳)
由于只有在客户端持有当前写锁的情况下才允许内容更新操作,我需要在事务中执行锁检查和内容写入(除非我缺少另一种方式?) .此外,由于客户端需要首先被确认为当前的锁持有者,因此必须在事务中进行锁刷新。
锁刷新是一个非常快速的操作。
内容更新操作可能相当复杂。把它想象成客户端向服务器发送一个复杂的更新脚本,服务器在内容上执行。
鉴于此,如果这两个事务之间存在冲突(如果它们同时执行),我宁愿锁刷新操作失败而不是复杂的内容更新。
有没有一种方法可以“确定”内容更新事务的优先级?我在文档中看不到任何内容,我想这不是一个特定的功能,但也许我可以使用一些技巧?
例如,如果我的内容更新读取条目,将其写回并稍作修改(不提交事务),然后执行冗长的操作并最终写入结果并提交事务,会发生什么?是否会立即应用第一次写入并导致同时锁定刷新事务失败?还是所有写入都保留到最后提交事务?
有没有保持两个交易开放的事情?还是在事务中进行中间提交?
显然,我可以将我的内容更新拆分为两个事务:第一个设置“请不要乱来!”标志,第二个(稍后)写入更改并清除该标志。
但也许还有其他一些技巧可以通过更少的读取/写入/事务来实现这一点?
我的另一个想法是有 3 个不同的数据“块”:当前锁持有者 (LH)、锁到期 (EX) 和正在修改的内容 (CO)。 lock-refresh 操作需要在一个事务中读 LH 和写 EX,而 content-update 操作需要在一个事务中读 LH、读 CO 和写 CO。有没有办法将数据分成三个实体,并以某种方式让事务只跨越所需的实体?由于这两个操作永远不会修改 LH,这可能有助于避免冲突吗?
【问题讨论】:
标签: google-app-engine transactions