-2

В этом методе есть один метод. Я вставляю три базы данных в базу данных. Но если произойдет какое-то исключение или ошибка, мне нужно отменить эту транзакцию ввода из db. Ниже показан случай использования метода.Откат Datastore PUT Транзакция в GAE Python Web

def post(): 
    try: 
     model1 = Model1() 
     model1.key1 = 'key1' 
     model1.key2 = 'key2' 
     model1.put() 

     #some logic1 code block goes here 
     . 
     . 
     model2 = Model2() 
     model2.key2 = 'key2' 
     model2.key2 = 'key2' 
     model2.put() 

     #some logic2 code block goes here 
     . 
     . 
     model3 = Model3() 
     model3.key3 = 'key3' 
     model3.key3 = 'key3' 
     model3.put() 

     #some logic3 block goes here 
     . 
     . 
    except Exception: 
     #all the database insertion transaction which happened should be rollback here. 

Здесь Model1, Model2 и Model3 являются google.appengine.ext.ndb.Model расширение модели классов. Теперь предположим, что исключение произошло в logic1 code block, тогда model1 должен быть откатом, поскольку он был вставлен перед выполнением этого logic1 code block. Аналогично, если исключение произошло в logic2 code block, то оба выше model1 & model2 должны быть откатами и так далее. Моя проблема очень распространена. Я много искал, но не смог найти решение. Я совершенно новый в Python и GAE. Пожалуйста помоги.

+1

Я не верю, что вы «много искали», но не смогли найти решение. Простой поиск «транзакции NDB» возвращает [эту страницу] (https://cloud.google.com/appengine/docs/python/ndb/transactions). –

+0

спасибо за ваш быстрый ответ. Но я думаю, что это не помогает мне. Я хочу сделать откат моих вставленных записей, если возникла некоторая ошибка после вставки записей в базу данных. Когда я использовал @ ndb.transactional, он не работал. Это будет более полезно, если вы дадите некоторое решение/идею для ответа вместо ссылки на документацию. –

+0

Вы помещаете декоратор вокруг всей логики, которая может вызвать исключение. –

ответ

-1

Как @Daniel Roseman, связанный с вами, ответ на NDB Transaction page. Просто найдите слово «rollback», и вы увидите его.

Для вашего кода, это означает:

@ndb.transactional(xg=True) 
def post(): 
    try: 
     model1 = Model1() 
     model1.key1 = 'key1' 
     model1.key2 = 'key2' 
     model1.put() 

     ... 

     #some logic3 block goes here 
     . 
     . 
    except Exception: 
     #all the database insertion transaction which happened should be rollback here. 
     raise ndb.Rollback 

Обратите внимание, что на декоратора я указанный xg-True, так как с фрагментом кода он выглядел, как это было, скорее всего, групповой операции кросс-объекта. Если это не так, и все сущности имеют один и тот же корень-предок, вы можете опустить это.

Также обратите внимание, что ndb.Rollback является исключительно удобством исключения - любое исключение, возникшее в функции, украшенной транзакцией, приведет к откату.

+0

Спасибо @Dan, но когда я реализовал это в своем текущем коде, я получаю исключение «BadRequestError: только предки, разрешенные внутри транзакций». Я совершенно новый в Python и GAE. Это исключение выбрано, когда я получаю запись из базы данных с помощью метода ndb.query(). –

+0

@vijayshegokar - ваш вопрос показывает только puts and gets - Datastore - это важная деталь, которую вы не должны упускать. Согласно документации вы можете запросить только предки внутри транзакций. В любом случае у вас не должно быть никакого другого типа запросов, поскольку он будет в конечном итоге последовательным без ограничения предка. Вам нужно будет переосмыслить свой дизайн. https://cloud.google.com/datastore/docs/concepts/transactions –