2

テーブル (キュー) のレコードを選択し、ロックし (他のプロセスはこのレコードを編集できません)、後で更新したいと考えています。
クエリと更新全体をトランザクションに入れると、他のプロセスは同じレコードを編集/クエリできないと思いました。しかし、私はこれを達成することはできません。

def move(one, two):
  from settings import DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME
  from sqlalchemy.orm import sessionmaker, scoped_session
  from sqlalchemy import create_engine
  engine = create_engine('postgres://%s:%s@%s:%s/%s' % (DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME), echo = False)
  conn = engine.connect()
  tran = conn.begin()
  Session = scoped_session(sessionmaker())
  session = Session(bind=conn)
  url = session.query(URLQueue).filter(URLQueue.status == one).first()
  print "Got record: " + str(url.urlqueue_id)
  time.sleep(5)
  url.status = two
  session.merge(url)
  session.close()
  tran.commit()

move('START', 'WIP')

2 つのプロセスを開始すると、両方とも同じレコードを更新します。接続/セッション/トランザクションを適切に作成したかどうかわかりません。ポインタはありますか?

4

1 に答える 1

1

トランザクション分離レベルをシリアライズ可能にするか、query.with_lockmode('update') を介して更新するレコードを取得します。

于 2009-08-19T05:34:50.640 に答える