-
-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optimistic Updates #2
Comments
所以我给出的方案就是不做真实写,如果 2 需要回滚,那么在action 2 被cancel掉之后,就做1 -> 3的写,因为操作一定是有序的 锁在这里是解决不了问题的,因为会严重迟滞数据的真实变化,而你说的问题本质上来说你需要一个MVCC :p,也就是我在原issue里说的『必须有数据整行快照』 |
我主要是担心在数据库外部做 |
以我的经验来说,这个解决方案你做了真实写,复杂度才会是真的高,因为你要额外设计很多机制来保证lf里存储的数据的『正确性』。 乐观更新的一个性质就是: |
首先,
其中如果是 get 的时候 combineLatest OptimisticCache ,这意味着
Task:
{
dueDate: {
$gte: new Date('2017-02-01').valueOf()
}
} Optimistic 其中一条数据的 dueDate 如何保证对这个查询的影响结果是正确的(在不真实写入 db 的情况下) |
其实,
这个场景是能解决的,因为匹配的策略不同,query是按
另外,基于做 |
嗯,我指的就是 query 查询某个 比如在 |
Revert API ProposalIntroduce new
|
暂定使用 |
我建议把 『乐观更新』这个行为当做是一个事务来看,因此 giveup() 应该 rename 到 commit() 与其说 block 表 的 C / U / D操作,我会更倾向把行为定义成:
锁任何写这个策略我其实很早就想过,这个机制有一个很大的问题就是:会极大的影响 client 的使用体验,它会把所有的写操作『强制序列化』,使得各种弱相关的操作响应时间无故拉长。 先去碎觉了~ |
有一个疑问: |
但是真对4,有一种hack的方法,就是把乐观数据的嵌套字段拍平... 但是这个方法就很丑了... |
@Miloas 关于第 3 点不是很明白,你指的是 |
比如聊天室我创建了三个假的(乐观的)channel,在关闭的时候,我需要把这三个全部revert了 这种情况 |
构造成一样似乎不行.. 比如
socket的数据是这样:
只能通过 |
{
_id: 'xxxxx'
creator: {
id: '123456'
name: 'xxx'
}
} 如果后端返回的是这种数据,那么这个行为是无法 revert 的= =,没法构建 predicate 查到这个数据啊,是不是要让后端处理一下返回数据,或者前端自己怼一个 _creatorId 出来 @Saviio 多个乐观更新全部 revert,我们可能要在 revertController 上提供一个 |
嗯 这样就很爽了 |
额,这周照旧很忙 (聊天里有好多性能问题要调,苍天大地啊-0-),细节我们也许可以等周六火车上聊。 所以这里先简单说几句我看到的: Point 1: {
_id: 'pseudo_xxxx'
creator: {
id: '123456'
name: 'xxx'
}
} 本质上,上面的数据的因为可以被转译成 SELECT
_id,
Member.id,
Member.name
FROM Message
JOIN Member ON Message.creatorId = Member.id
WHERE Member.id = '123456' 理论上,这部分功能应该是可以被实现、也应该被实现,而且优先级要比 Point 2: 其实早期的时候(3月左右?)我曾经设计过一个外置的 Transaction 的 feature,可以以类似以下的方式写代码 (伪代码),这样模式可能会更正交。 import { Database, TransactionScope } from 'reactivedb'
const db = new Database()
const tx = new TransactionScope()
const q1 = db.update('foo', { where: { _id: 1 } })
const q2 = db.insert('foo', { _id: 2 })
tx.commit()
// q1 q2 会在一个事务内被执行 但后来另外一个 feature 干扰到了这个设计(但具体原因我已经忘了- -),我就没做实现了。 Point 3:
我认为这个歧义在于,我把『乐观更新』的着眼点放在事务上,而你可能更放在 Point 4:
我洗澡的时候一想,这其实等于开了一个 Point 5: 暂时就想到这么多....讲道理我觉得 |
resolve: teambition/ReactiveDB#91
@suyu34 @zry656565 @Miloas @chuan6
The text was updated successfully, but these errors were encountered: