2009-09-11 34 views
3

我很困惑如何從多個不同的進程併發修改表。我試過使用Query.with_lockmode(),但似乎沒有做到我期望的那樣做,這將阻止兩個進程同時查詢相同的行。以下是我已經試過:鎖定在sqlalchemy

import time 
from sqlalchemy.orm import sessionmaker, scoped_session 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import * 

engine = create_engine('mysql://...?charset=utf8&use_unicode=0', pool_recycle=3600, echo=False) 
Base = declarative_base(bind=engine) 
session = scoped_session(sessionmaker(engine)) 

class Test(Base): 
    __tablename__ = "TESTXYZ" 
    id = Column(Integer, primary_key=True) 
    x = Column(Integer) 

def keepUpdating(): 
    test = session.query(Test).filter(Test.id==1).with_lockmode("update").one() 

    for counter in range(5): 
     test.x += 10 
     print test.x 
     time.sleep(2) 

    session.commit() 


keepUpdating() 

如果我同時兩次運行此腳本,我得到session.query(Test).filter(Test.id==1).one().x等於50,而不是100(假設它爲0以開始),這是我所希望的。如何讓兩個進程同時更新值或讓第二個進程等待第一個進程完成?

回答

4

你是否偶然使用MyISAM表?這對於InnoDB表格可以很好地工作,但是會與MyISAM一起描述行爲(無法忽視隔離)。

+0

謝謝,這是一個非常愚蠢的錯誤。簡直不敢相信我花了這麼多時間。 – Noah 2009-09-11 15:15:44