As article on http://www.keakon.net/article/1843 suggests , you can create
task queue on successful completion of 1st transaction , same can be done
when exception  occurred  in 1st transaction.
I did not try this solution but it seems like good option.

By this way we can achieve atomicity like in banking example .



2010/12/16 风笑雪 <kea...@gmail.com>

> 不能rollback,但可以roll forward。
> 这篇可能对你有帮助:
> http://www.keakon.net/article/1843
>
> ----------
> keakon
>
> My blog(Chinese): www.keakon.net
> Blog source code: https://bitbucket.org/keakon/doodle/
>
>
>
> 2010/12/16 EtuO <nbaer...@gmail.com>
>
>> 谢谢大家,只能开启两个事务来解决啦。
>>
>> 在 2010年12月16日 下午6:11,kartik kudada <kartik.kud...@gmail.com>写道:
>>
>> If following operation throws an exception,we can not rollback the first
>>> transaction, because it is already committed. What I can think of right now
>>> is, you can manually delete it. but it is not the genuine solution.
>>>
>>> Why don't you create owned relation between these two table?
>>> Tell me about your thoughts?
>>>
>>> Regards,
>>> Kartik
>>>
>>> 2010/12/16 Liang Ding <dl88...@gmail.com>
>>>
>>> Hi, kartik.
>>>> It works, but how can I rollback the 'first transaction' if the
>>>> following operations throws an exception?
>>>>
>>>> 2010/12/16 kartik kudada <kartik.kud...@gmail.com>
>>>>
>>>>> You can not operate on two entities in single transaction unless both
>>>>> are entity groups.
>>>>> First delete CityNum  in one transaction and then
>>>>> delete ScheduleProcess  in different transaction,
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> 2010/12/16 EtuO <nbaer...@gmail.com>
>>>>>
>>>>>> Caused by: java.lang.IllegalArgumentException: can't operate on
>>>>>>
>>>>>> multiple entity groups in a single transaction. found both Element {
>>>>>>  type: "CityNum"
>>>>>>  name: "013001"
>>>>>> }
>>>>>>  and Element {
>>>>>>  type: "ScheduleProcess"
>>>>>>  name: "013001"
>>>>>> }
>>>>>>
>>>>>>        at
>>>>>>
>>>>>> com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:
>>>>>> 36)
>>>>>>        at com.google.appengine.api.datastore.DatastoreApiHelper
>>>>>> $1.convertException(DatastoreApiHelper.java:98)
>>>>>>        at
>>>>>> com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:
>>>>>> 69)
>>>>>>        at com.google.appengine.api.datastore.FutureHelper
>>>>>> $CumulativeAggregateFuture.get(FutureHelper.java:136)
>>>>>>        at com.google.appengine.api.datastore.FutureHelper
>>>>>> $TxnAwareFuture.get(FutureHelper.java:213)
>>>>>>        at
>>>>>> com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:
>>>>>> 67)
>>>>>>        at
>>>>>>
>>>>>> com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:
>>>>>> 71)
>>>>>>        at
>>>>>>
>>>>>> com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:
>>>>>> 58)
>>>>>>        at
>>>>>>
>>>>>> com.google.appengine.api.datastore.DatastoreServiceImpl.get(DatastoreServiceImpl.java:
>>>>>> 55)
>>>>>>        at
>>>>>>
>>>>>> org.datanucleus.store.appengine.RuntimeExceptionWrappingDatastoreService.get(RuntimeExceptionWrappingDatastoreService.java:
>>>>>> 64)
>>>>>>        ... 86 more
>>>>>>
>>>>>> 实现类代码:
>>>>>> /**
>>>>>>     * @see
>>>>>>
>>>>>> org.ertuo.taoplugin.facade.TransactionOperation#nestTrans(java.lang.Object[])
>>>>>>     */
>>>>>>    public void nestTrans(Object... objects) {
>>>>>>        String id = (String) objects[0];
>>>>>>        CityNum cn = cityNumDao.get(id);
>>>>>>        ScheduleProcess sp = scheduleDao.get(id);
>>>>>>        cityNumDao.delete(cn);
>>>>>>        scheduleDao.delete(sp);
>>>>>>        logger.info("id[" + id + "]对应的城市和任务删除完毕");
>>>>>>    }
>>>>>>
>>>>>> 接口代码:
>>>>>> /**
>>>>>>  * 事务性操作接口
>>>>>>  * @author mo.duanm
>>>>>>  * @version $Id: TransactionOperation.java, v 0.1 2010-12-16 下午
>>>>>> 05:22:23 mo.duanm Exp $
>>>>>>  */
>>>>>> public interface TransactionOperation {
>>>>>>
>>>>>>    /**
>>>>>>     * 嵌套事务
>>>>>>     * @param objects
>>>>>>     */
>>>>>>    @Transactional
>>>>>>    public void nestTrans(Object... objects);
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Google App Engine for Java" group.
>>>>>> To post to this group, send email to
>>>>>> google-appengine-j...@googlegroups.com.
>>>>>> To unsubscribe from this group, send email to
>>>>>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
>>>>>> .
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/google-appengine-java?hl=en.
>>>>>>
>>>>>>
>>>>>  --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Google App Engine for Java" group.
>>>>> To post to this group, send email to
>>>>> google-appengine-j...@googlegroups.com.
>>>>> To unsubscribe from this group, send email to
>>>>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
>>>>> .
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/google-appengine-java?hl=en.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> My Blog: http://blog.csdn.net/DL88250
>>>> --------------------------------------------------------
>>>> Open Source, Open Mind, Open Sight, Open Future!
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Google App Engine for Java" group.
>>>> To post to this group, send email to
>>>> google-appengine-j...@googlegroups.com.
>>>> To unsubscribe from this group, send email to
>>>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
>>>> .
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/google-appengine-java?hl=en.
>>>>
>>>
>>>  --
>>> You received this message because you are subscribed to the Google Groups
>>> "Google App Engine for Java" group.
>>> To post to this group, send email to
>>> google-appengine-j...@googlegroups.com.
>>> To unsubscribe from this group, send email to
>>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/google-appengine-java?hl=en.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "Google App Engine for Java" group.
>> To post to this group, send email to
>> google-appengine-j...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/google-appengine-java?hl=en.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Google App Engine for Java" group.
> To post to this group, send email to
> google-appengine-j...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-appengine-java+unsubscr...@googlegroups.com<google-appengine-java%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-appengine-java?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to