9

在 Google App Engine 中,事务隔离被称为 SNAPSHOT 隔离,您看不到之前的删除或放入事务本身,而只能看到事务开始时数据存储区的状态(https://developers.google.com/ appengine/docs/python/datastore/transactions)。在一篇较早的文章中,它说事务级别实际上是 SERIALIZABLE ( https://developers.google.com/appengine/articles/transaction_isolation )。

Google Test Compatibility Kit (TCK) 显示它确实是 SNAPSHOT 隔离,但在前面的文章中它说“Inside transactions,另一方面,隔离级别默认为 SNAPSHOT,可以选择更改为 SERIALIZABLE”。

我的问题是,如何使隔离级别变为 SERIALIZABLE?

4

1 回答 1

3

您可以在 BeginTransaction API Reference中查看如何更改隔离级别。它目前只能在 Google Cloud Datastore HTTP API 中进行配置,并且对于所有 App Engine SDK 默认为 SERIALIZABLE。但是我不认为这会做你想做的事。

SNAPSHOT 与 SERIALIZABLE 控制事务隔离或并发事务如何相互交互。它不控制事务如何与自身交互(尽管在某些系统中这两件事是混为一谈的)。

在 Datastore 中,设置 SERIALIZABLE 不会使事务能够看到它自己的未提交突变。这仅意味着如果它们的读写模式在序列化时无效,并发事务将发生冲突。例如,以下两个事务在使用 SERIALIZABLE 隔离时必然会发生冲突:

TX1: READ A, WRITE B'
TX2: READ B, WRITE A'

由于这两种排序都不可能:

READ A, WRITE B', READ B (conflict), WRITE A'
READ B, WRITE A', READ A (conflict), WRITE B'

但是,这些事务不一定会与 SNAPSHOT 隔离发生冲突。

SNAPSHOT 和 SERIALIZABLE 都从数据的“快照”中读取,就好像在事务运行时以与事务隔离保证冲突的方式更改数据一样,无法提交事务。

于 2013-09-03T22:42:49.513 回答