2012-04-05 71 views
2

如果两个事务(都在RR隔离级别)请求第二级高速缓存的相同项目,然后他们修改并存储此项目。现在,为了阅读该项目,他们没有运行任何SQL,因为它被缓存;所以在这种情况下,他们真的会启动一个数据库事务吗?当他们提交更改时,他们是否会遇到丢失更新问题?休眠二级缓存和RR事务隔离

回答

1

从一个悲观点:

如果第二级高速缓存被配置为参与交易,那么只有第一获取了写锁定将能够修改高速缓存的对象的一个​​,然后写对数据库的更改。当第二个事务想要获得写入锁时,它必须等到第一个事务结束并释放它。

通过乐观锁定,我猜应该发生并发修改异常(或类似名称),第二个事务会重试该操作。

+0

假设缓存是可读写的。事务将不会获得数据库中的共享读锁,因为他们永远不会去数据库读取数据。假设t1先更新,那么它会锁定对象,获取数据库写入锁定,更新数据库并释放数据库写入锁定和对象锁定; t2然后锁定对象,获取数据库写入锁定,更新数据库并释放数据库写入锁定和对象锁定。那么t2不会覆盖t1的变化吗?那么即使隔离级别是RR,我们也不会丢失更新吗? – shrini1000 2012-04-05 16:45:17

+0

在你提到的例子中,t1先写入然后写入t2。当t2读取BEFORE t1改变的值之后写入失败更新问题。在你的例子中,没有事务读取任何东西,他们只写。如果t2在t1更新之前读取了值,则t1将无法执行更新,因为t2有读锁。写锁定不能与读锁共享。 – Luciano 2012-04-05 17:21:48

+0

那么,因为它们都从缓存中读取,它们将获得相同的值。所以t2会在t1写入之前读取该值。然后t1写入它,然后t2写入它。由于他们没有使用任何共享读锁(因为该值来自缓存而不是数据库),这不会导致t1的丢失更新吗? – shrini1000 2012-04-06 03:53:51