python可以实现两个操作同时成功执行,其中一个操作失败时则都不执行吗?

例如,我需要删除本地文件且同时删除数据库中的记录,如果像下面的代码,当我的sql语句有问题的时候会出现本地文件成功删除,但是数据库记录因为sql语句问题没被删除的情况。
请问,有没有方法使得两个操作可以同时成功执行,当其中一个操作失败则都不执行?

try:
    remove_file() #删除本地文件
    remove_dbrecord() #删除数据库记录
except:
    ..........
阅读 5.5k
5 个回答

如果第一个操作成功了,第二操作就算失败了,也不可能revert第一个操作吧,万一revert操作本身还失败呢。。。。

try:
    rc = remove_file() #删除本地文件
    if rc:
        rc &= remove_dbrecord() #删除数据库记录
except:
    # TODO: revert?
finally:
    if rc:
        print('Done')
    else:
        # TODO: revert?

文件先做备份
数据库用事务提交操作
如果任意一个操作失败,则恢复文件备份,数据库事务回滚。

根据你的代码改的伪装代码

try:
    is_file_del=move_file_tmp() #文件移动到非占用临时目录  remove_file 应该有返回值 true or false
    # 文件移动到临时目录成功
    if is_file_del:
        is_rc_del=remove_dbrecord() #删除数据库记录 remove_dbrecord 应有返回值,记录是否删除成功 true or false
        
        if is_rc_del:
            #数据库记录删除成功
            #将该文件从临时目录中删除
            remove_file_in_tmp()
        else 
            #数据库记录删除失败
            #将之前移动的文件还原
            move_file_back()   
except:
    # ..........

可以专门建一个文件夹当作垃圾处理站,sql语句事务提交,如果事务成功,就把物理文件移动到垃圾站里面,如果捕捉到事务失败,数据库就回滚,而文件就恢复到原有目录,垃圾文件夹可以定时任务定期去清理

谢谢大家的回答!
我现在打算把文件删除操作放在sql语句后,commit()之前,就像这样:

try:
    conn = MySQLdb.connect()
    cursor = conn.cursor()
    cursor.execute('delete from db_table where id = file_id')
    remove_file()
    conn.commit()
except:
    conn.rollback()
finally:
    conn.close()

这样的话当sql操作出错,不会执行remove_file(),当remove_file()出错的时候数据库会执行rollback()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题