9.3. 事务锁定
9.3.1. pessimistic 事务缓存
从锁定收购角度来看,在编写密钥时,基于密钥的 pess 事务会获得锁定。
- 将锁定请求发送到主所有者(可以是显式锁定请求或操作)
主要所有者会尝试获取锁定:
- 如果成功,它会发回一个正回复;
- 否则,会发送负回复,事务会被回滚。
例如:
transactionManager.begin(); cache.put(k1,v1); //k1 is locked. cache.remove(k2); //k2 is locked when this returns transactionManager.commit();
当 cache.put (k1,v1)
返回时,k1
被锁定,集群中的任何位置都没有运行其他事务。仍可读取 k1
。当事务完成后(提交或回滚)时,k1
上的锁定会被释放。
注意
对于条件操作,验证在 originator 中执行。
9.3.2. 最佳事务缓存
使用最佳交易锁定会在事务准备时获取,并且仅持有事务提交(或回滚)的时间。这与 5.0 默认锁定模型不同,在写入时获取本地锁定,并在准备期间获取集群锁定。
- 准备发送给所有所有者。
主要所有者试图获取所需的锁定:
- 如果锁定成功,它将执行写入偏移检查。
- 如果写入偏移检查成功(或被禁用),请发送正回复。
- 否则,会发送负回复,并回滚事务。
例如:
transactionManager.begin(); cache.put(k1,v1); cache.remove(k2); transactionManager.commit(); //at prepare time, K1 and K2 is locked until committed/rolled back.
注意
对于条件命令,在原始卷中仍然会出现验证。
9.3.3. 我需要什么 - pessimistic 或 optimistic transaction?
从用例的角度来看,当多个事务同时运行的多个事务之间没有大量竞争时,应使用最佳事务。这是因为,如果数据在读取的时间和提交的时间(启用了写偏移检查)之间有所变化,则最佳事务回滚。
另一方面,当键和事务回滚非常竞争时,pessimistic 事务可能更适合。pessimistic 事务的性质更加昂贵:每个写入操作都可能涉及对锁定收购的 RPC。