Appengine 文档对数据存储区中的事务这么说: http ://code.google.com/appengine/docs/java/datastore/transactions.html#Isolation_and_Consistency
In a transaction, all reads reflect the current, consistent state of the
Datastore at the time the transaction started. This does not include
previous puts and deletes inside the transaction. Queries and gets inside
a transaction are guaranteed to see a single, consistent snapshot of the
Datastore as of the beginning of the transaction.
考虑到这一点,我创建了以下两个单元测试来测试它(针对本地数据存储)。我希望下面的两个测试都能通过。但是,只有“test1”通过,而“test2”失败。唯一的区别是在“test1”中提交了 tx1。
这是本地数据存储中的错误、对 GAE 文档的误解,还是我的单元测试中的错误?或者是其他东西?
谢谢!
@Test(expected = EntityNotFoundException.class)
public void test1() throws EntityNotFoundException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
// Create 2 Transactions...
Transaction txn1 = datastore.beginTransaction();
Transaction txn2 = datastore.beginTransaction();
try {
Key entityWithStringKey = KeyFactory.createKey("TestEntity", "test");
Entity entityWithString = new Entity(entityWithStringKey);
datastore.put(txn1, entityWithString);
entityWithString = datastore.get(txn2, entityWithStringKey);
// The above should throw EntityNotFoundException
assertNull(entityWithString);
}
finally {
if (txn1.isActive()) {
txn1.rollback();
}
if (txn2.isActive()) {
txn2.rollback();
}
}
@Test(expected = EntityNotFoundException.class)
public void test2() throws EntityNotFoundException {
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
// Create 2 Transactions...
Transaction txn1 = datastore.beginTransaction();
Transaction txn2 = datastore.beginTransaction();
Key entityWithStringKey = KeyFactory.createKey("TestEntity", "test");
try {
Entity entityWithString = new Entity(entityWithStringKey);
datastore.put(txn1, entityWithString);
txn1.commit();
} finally {
if (txn1.isActive()) {
txn1.rollback();
}
}
try {
Entity entityWithString = datastore.get(txn2, entityWithStringKey);
assertNull(entityWithString);
// The above should throw EntityNotFoundException
}
finally {
if (txn2.isActive()) {
txn2.rollback();
}
}
}