2011-01-27 16 views
0

以下は私のコードです。 エラーが発生すると、mongoレコードは削除されますが(。yay!)、.rollback()は機能しません。そのため、mysqlはレコードをローリングする代わりに保持しますバック。どうして?エラーが発生した場合、私のDjangoコードが変更をロールバックしないのはなぜですか?

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 
+0

エラーの原因を教えてください。 – John

+0

このコードをテストするために、間違ったものをいくつか紹介しました。次に、例外がヒットしました。これはロールバック()されているはずですが、mysqlはロールバックしません。 Mongoは投稿を削除します。エラーはありません。それは単に行くだけです。 – TIMEX

答えて

3

あなたはMyISAMテーブルとは異なり、トランザクションをサポートし、InnoDBのテーブルエンジンを使用していないので。

+0

彼はどのDBエンジンを使用しているのですか? – John

+0

これは正しいです。私はそれをInnodbに変更しました。 – TIMEX

関連する問題