Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy(Postgres)和事务_Python_Postgresql_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy(Postgres)和事务

Python SQLAlchemy(Postgres)和事务,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我希望从表(队列)中选择、锁定(没有其他进程可以编辑此记录)并在稍后的时间点更新记录。 我假设如果我将整个查询和更新放在一个事务中,没有其他进程可以编辑/查询相同的记录。但我不太可能做到这一点 def move(one, two): from settings import DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME from sqlalchemy.orm import ses

我希望从表(队列)中选择、锁定(没有其他进程可以编辑此记录)并在稍后的时间点更新记录。
我假设如果我将整个查询和更新放在一个事务中,没有其他进程可以编辑/查询相同的记录。但我不太可能做到这一点

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个进程,它们都会更新相同的记录。我不确定是否正确创建了连接/会话/事务。任何指针?

使事务隔离级别可序列化,或通过查询获取记录以进行更新。使用锁定模式(“更新”)