问题是:ds.put(员工)是否在交易中发生?或者外部事务是否被saveRecord(..)中的事务擦除/覆盖?
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService() Transaction txn = datastore.beginTransaction(); try { for (int i=0; 1<10; i++) { Key employeeKey = KeyFactory.createKey("Employee", "Joe"); Entity employee = datastore.get(employeeKey); employee.setProperty("vacationDays", 10); datastore.put(employee); Entity employeeRecord = createRecord("record", employeeKey); saveRecord(employeeRecord); } txn.commit(); } finally { if (txn.isActive()) { txn.rollback(); } } public void saveRecord(Entity entity) { datastore.beginTransaction(); try { // do some logic in here, delete activity and commit txn datastore.put(entity); } finally { if (datastore.getCurrentTransaction().isActive()) { datastore.getCurrentTransaction().rollback(); } } }
答案 0 :(得分:1)
好的,我假设你使用的是低级数据存储API。请注意,getTransaction()
不存在。我假设你的意思是datastoreService.getCurrentTransaction()
。
DatastoreService.beginTransaction()
将返回一个事务,在您再次调用beginTransaction()
之前,该事务被视为同一线程上的当前事务。由于您在“外部”事务中的循环中调用beginTransaction()
,它会破坏您的“外部”代码:循环结束后ds.getCurrentTransaction()
不会返回相同的事务。此外,put()
隐式使用当前事务。
首先,您必须修复外部代码以将事务保存为shown in example:
public void put(EventPlan eventPlan) {
Transaction txn = ds.beginTransaction();
try {
for (final Activity activity : eventPlan.getActivities()) {
save(activity, getPlanKey(eventPlan)); // PUT
// IMPORTANT - also pass transaction and use it
// (I assume this is some internal helper method)
ds.put(txn, activity, getSubPlanKey(eventPlan)); //subplan's parent is eventPlan
}
txn.commit();
} finally {
if (txn.isActive())
txn.rollback();
}
}
现在回答问题:
是的,因为所有看跌期权现在都是同一交易的一部分(在您修改代码之后),如果出现错误,您就会调用txn.rollback()
。
不,当然不是。它们是不同交易的一部分。