通过sqlAlchemy明确在PostgreSQL中使用BEGIN,COMMIT和ROLLBACK

时间:2018-10-05 18:59:30

标签: postgresql transactions sqlalchemy

我一直在使用PostgreSQL进行业务分析查询,但是数据库管理方面的一个新手需要第一次在几个表上执行一些事务。

PostgreSQL documentation

  

BEGIN启动一个事务块,即BEGIN命令之后的所有语句将在单个事务中执行,直到给出明确的COMMIT或ROLLBACK。

因此,这意味着BEGINCOMMIT之间的所有内容只有在所有操作成功完成之后才会写入磁盘。

但是,在我读过的有关PostgreSQL like this one中的事务管理的一些教程文章中,在事务中间添加了SAVEPOINT

BEGIN;
    UPDATE tbl_Employees
    SET EmpName = 'Grace'
    WHERE EmpID = 4;

SAVEPOINT EmpSave;

    UPDATE tbl_Employees
    SET EmpName = 'Kunal'
    WHERE EmpID = 5;

ROLLBACK TO EmpSave;

我是否正确假设此处的员工Grace将被更新,而员工Kunal将被临时更新,但是随后将执行回滚,立即恢复到Grace的更新后状态?我知道这是一个玩具示例,但是什么时候我会平时需要在SAVEPOINTBEGIN块中使用COMMIT,因为其中的所有内容都被视为单个原子事务反正阻止?如果我想逐步保存自己的进度,我会重新打开自动提交吗?!

换句话说,我无法看到如何在没有某种逻辑的情况下合并ROLLBACK,即是否抛出了ROLLBACK异常,否则继续和COMMIT。几乎所有示例都使用psql命令行,这不是我通常使用PG执行SQL查询的方式。

我的第一个问题是:如何在BEGIN / COMMIT块中间实现条件回滚?还是由于事务块隐式包含回退到BEGIN之前的状态而甚至没有必要?

到目前为止,我发现在BEGINCOMMIT块中合并条件逻辑的唯一方法是在SQL sqlalchemy这样的程序管理器中编写SQL,使用类似下方:

engine = create_engine("...")
Session = sessionmaker(bind=engine)
session = Session()
try:
    item1 = session.query(Item).get(1)
    item2 = session.query(Item).get(2)
    # pending changes are created.
    item1.foo = 'bar'
    item2.bar = 'foo'
    session.commit()
except:
     session.rollback()
     raise
finally:
     session.close()

我的第二个问题:是使用Python和ROLLBACK(或另一种语言)以编程方式向我的COMMITsqlalchemy中添加逻辑的唯一方法?

0 个答案:

没有答案