Почему мой код Django не выполняет откат изменений при возникновении ошибки? - PullRequest
0 голосов
/ 27 января 2011

Ниже мой код.(Он запускается Celery, но я не думаю, что это важно.) Когда происходит ошибка, запись монго удаляется (ууу!), Но .rollback () не работает, поэтому mysql сохраняет запись вместо ее отката.,Почему?

class Submitter(Task):
    @transaction.commit_manually
    def run(self, post, **kwargs):
        docDB = h.connect_mongo(collection="posts")

        post = cPickle.loads(post)
        if post.has_key("original_file"):
            try:
                post = docProcessor.process_images(post)
            except:
                traceback.print_exc()
        post['processed'] = True

        #START INSERT -------
        try:
            mongo_id = docDB.insert(post)
            author = User.objects.get(id=post['author_id'])

            #Sync mysql content with mongo id
            c, created = Content.objects.get_or_create(mongo_id = str(mongo_id), author=author)
            c.save()

            #now update the content_id
            post['content_id'] = c.id
            post['_id'] = mongo_id
            updated = docDB.save(post)

            #finally, add a vote to the document.
            h.insert_vote(content_id = c.id, lat = post['loc_latlong'][0],
                     long = post['loc_latlong'][1],
                     ip = post['ip'], thevote = 1, theuser = author, mongo_con = docDB)

            transaction.commit()
        except:
            transaction.rollback()
            docDB.remove(post)
        #END INSERT --------

        return True

1 Ответ

3 голосов
/ 27 января 2011

Поскольку вы не используете механизм таблиц InnoDB, который, в отличие от MyISAM, поддерживает транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...