我们的代码仓库大量地应用了装饰器rollback_on_failure
, 已保证在出错时函数可以回滚事务。
以下是其实现:
在一次报错中,我发现它无法应用在一种情况里。
假设我们有这样的函数:
当代码进入 OperationalError 分支时,这段代码其实是有问题的。
因为数据库的报错,SQLAlchemy 将此次 Session 标为过期,我们无法再从 obj 里获取数据
正确的写法是:
- 首先应该回滚事务,结束当前Session,此时获取数据才有意义
- 如果要获取最新的stock, 应该在事务结束后,在控制层获取