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