Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.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 Zope事务管理器间歇性提交失败[带芹菜任务的金字塔应用程序]_Python_Postgresql_Sqlalchemy_Pyramid_Zope - Fatal编程技术网

Python 应用程序成功,但SqlAlchemy Zope事务管理器间歇性提交失败[带芹菜任务的金字塔应用程序]

Python 应用程序成功,但SqlAlchemy Zope事务管理器间歇性提交失败[带芹菜任务的金字塔应用程序],python,postgresql,sqlalchemy,pyramid,zope,Python,Postgresql,Sqlalchemy,Pyramid,Zope,简史: 从过去几周开始,我们的pyramid web应用程序遇到了一个间歇性问题—某些DB事务无法提交。尽管这种观点得到了成功的回应 我们一直在努力寻找一种模式,但没有成功。 调试成功与不成功txn之间的唯一区别如下: 成功日志: 2017-10-22 08:22:41,034 [3360] [sqlalchemy.engine.base.Engine:INFO] ROLLBACK 2017-10-22 08:22:41,034 [3360] [txn.140257118390016:DEBUG

简史:

从过去几周开始,我们的pyramid web应用程序遇到了一个间歇性问题—某些DB事务无法提交。尽管这种观点得到了成功的回应

我们一直在努力寻找一种模式,但没有成功。 调试成功与不成功txn之间的唯一区别如下:

成功日志:

2017-10-22 08:22:41,034 [3360] [sqlalchemy.engine.base.Engine:INFO] ROLLBACK
2017-10-22 08:22:41,034 [3360] [txn.140257118390016:DEBUG] commit 
<zope.sqlalchemy.datamanager.SessionDataManager object at 0x7f9019dbf990>
2017-10-22 08:22:41,034 [3360] [txn.140257118390016:DEBUG] commit
2017-10-22 04:45:10,504 [3360] [txn.140257118390016:DEBUG] commit
2017-10-22 04:45:10,504 [3360] [sqlalchemy.engine.base.Engine:INFO] ROLLBACK
请注意,缺少SessionDataManager对象,并且语句顺序相反

应用程序设置:

  • 炼金术
  • Zope事务管理器
  • 博士后数据库
  • 芹菜
  • 兔子
  • 金字塔网络框架
  • 弹性搜索
相关代码片段:

数据库初始化 init.db

import sqlalchemy
import zope.sqlalchemy
import zope.sqlalchemy.datamanager
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
.
.
.
Session = sessionmaker()

engine = sqlalchemy.create_engine(settings['dburl'])
config.registry['sql_engine'] = engine
config.add_request_method(_session, name='db', reify=True)
_会话方法如下所示

def _session(request):
 engine = request.registry['sql_engine']
 session = Session(bind=engine)
try:
    tm = request.tm
except AttributeError:
    pass
else:
    zope.sqlalchemy.register(session, transaction_manager=tm)

return session
事务管理器挂接方式如下:

config.add_settings({
    "tm.attempts": 3,
    "tm.manager_hook": lambda request: transaction.TransactionManager(),
})
config.include('pyramid_tm')
毫无例外地返回的服务代码为:

def create_obj(request, data):

# Create an obj from passed data.

created = updated = datetime.utcnow()

obj = models.Obj(**data)
obj.created = created
obj.updated = updated

request.db.add(obj)
try:     
   request.db.flush() # to use the returned id
except Exception as e:
    log.error('Createlog 1: Exception %s occurred while creating annotation %s', e, obj.id)
    raise HTTPConflict()

return obj
我也曾尝试过这样捕捉视图中的异常,但这并没有为我提供更多的细节

@view_config(context=SqlAlchemyOperationalError)
def failed_sqlalchemy(exception, request):
 log.warning("There was an error in SqlAlchemy!")
 log.warning(request.exception)
 pass
有人能帮我吗 1.我如何才能获得有关该问题的更多信息? 2.我看到的日志模式的意义是什么? 3.我的会话是否会因为一些我不知道的种族条件而被破坏


很乐意提供所需的更多详细信息。

我不确定这是否与上面显示的日志有关,但如果事务只从数据库中读取而不写入,它将回滚而不是提交。我想他们这样做是为了在检查序列化错误时减少数据库的负载(如果使用可序列化隔离级别)using@MichaelMerickelpyramid_tm版本为1.1.1,pyramid版本为1.7。3@AntoineLeclair这两个日志在不同的时间具有相同的代码段。这段代码正在向数据库写入新行。在我的问题中,代码被称为服务代码,我不确定这是否与上面显示的日志有关,但是如果事务只从数据库读取而不写入,它将回滚而不是提交。我想他们这样做是为了在检查序列化错误时减少数据库的负载(如果使用可序列化隔离级别)using@MichaelMerickelpyramid_tm版本为1.1.1,pyramid版本为1.7。3@AntoineLeclair这两个日志在不同的时间具有相同的代码段。这段代码正在向数据库写入新行。我的问题中提到的代码是服务代码,