1

я в настоящее время изучение transactions, и я получаю сообщение об ошибке:BadRequestError: Вложенные транзакции не поддерживаются

BadRequestError: Nested transactions are not supported

Я понятия не имею, как решить эту проблему. Любая помощь будет оценена по достоинству.

main.py

import webapp2 
import jinja2 
import os 
import datetime 

from google.appengine.ext import db 

jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__))) 

class MainPage(webapp2.RequestHandler): 
    def get(self):   
     transaction_status = create_message_txn("Python_Board", "message name", "Message Title", "Here is the message text") 

     message = Message.all() 

     template_values = { 
      'transaction_status': transaction_status, 
      'message': message, 
     }  

     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 


class MessageStore(webapp2.RequestHandler): 
    def post(self): 
     message = Message() 
     message.message_title = self.request.get('message_title')  
     message.message_text = self.request.get('message_text')  
     photo.put() 
     self.redirect('/')  


class MessageBoard(db.Expando): 
    pass 


class Message(db.Expando): 
    pass 

def create_message_txn(board_name, message_name, message_title, message_text): 
    board = db.get(db.Key.from_path('MessageBoard', board_name)) 
    if not board: 
     board = MessageBoard(key_name=board_name) 
     board.count = 0 

    message = Message(key_name=message_name, parent=board) 
    message.title = message_title 
    message.text = message_text 
    message.post_date = datetime.datetime.now() 

    board.count += 1 

    db.put([board, message]) 

    try: 
     db.run_in_transaction(create_message_txn, board_name=board_name, 
     message_name=message_title, 
     message_title=message_title, 
     message_text=message_text) 
    except db.TransactionFailedError, e: 
     transaction_status = "Transaction failed: %s " %e 

app = webapp2.WSGIApplication([('/', MainPage), 
           ('/new_message',MessageStore)], debug=True) 

index.html

<html> 
    <body>      
     <form action="/new_photo" method="post">    
      <label for="message_title">Message Title</label> 
      <div><textarea name="message_title" rows="1" cols="60" id="message_title"></textarea></div>   
      <label for="message_text">Message Text</label> 
      <div><textarea name="message_text" rows="3" cols="60" id="message_text"></textarea></div>      
      <input type="submit" value="Submit"> 
     </form> 
     <div><hr></hr></div>   
     <div><b>{{ transaction_status }}</b></div>   
     <div><hr></hr></div>    
     {% for m in message(limit=5): %} 
     <div><b>{{ m.title }}</b></div> 
     <div>{{ m.text }}</div> 
     <div>{{ m.date }}</div> 
     <div><hr></hr></div>   
     <b>{% endfor %}</b> 
    </body> 
</html> 

ответ

1

это выглядит, как вы recursivley вызова create_message_txn

def create_message_txn(): 

    # code happening here 
    db.run_in_transaction(create_message_txn, board_name=board_name 

^run_in_transaction звонки create_message_txn который называет run_in_transaction который вызывает ЭСТ ...

Вы можете исправить это, разбивая код, который вы хотите запустить, как транзакции в отдельную функцию

+0

+1 Спасибо за ваш ответ. Я новичок в транзакциях, я только начал изучать механизм Google App. Я взломал этот код вместе, пытаясь понять, как работают транзакции. Как я рекурсивно вызываю create_message_txn? Можете ли вы порекомендовать простой пример, показывающий транзакции в действии? – Anthony

+2

@ Энтони Ваша ошибка не связана с транзакциями, она связана с вашим дизайном программы, транзакции хороши, потому что вся транзакция либо терпит неудачу, либо преуспеет, классический пример - банковское дело, чтобы вы могли сделать платеж кому-то, это процесс из 2 частей , снимать деньги со своего счета и кредитовать кого-то elses, для этого требуется 2 запроса. Если ваша учетная запись снята, а затем есть ошибка, вы получаете деньги, а другой человек никогда не зачисляется! 'run_in_transaction' позволяет выполнять многопроцессорные запросы, которые заполняют все части или никакие части. – dm03514

+0

Хорошо, я попытаюсь переписать это и вернуться в ближайшее время. – Anthony

Смежные вопросы