例如,我需要删除本地文件且同时删除数据库中的记录,如果像下面的代码,当我的sql语句有问题的时候会出现本地文件成功删除,但是数据库记录因为sql语句问题没被删除的情况。
请问,有没有方法使得两个操作可以同时成功执行,当其中一个操作失败则都不执行?
try:
remove_file() #删除本地文件
remove_dbrecord() #删除数据库记录
except:
..........
例如,我需要删除本地文件且同时删除数据库中的记录,如果像下面的代码,当我的sql语句有问题的时候会出现本地文件成功删除,但是数据库记录因为sql语句问题没被删除的情况。
请问,有没有方法使得两个操作可以同时成功执行,当其中一个操作失败则都不执行?
try:
remove_file() #删除本地文件
remove_dbrecord() #删除数据库记录
except:
..........
根据你的代码改的伪装代码
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()
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答978 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
如果第一个操作成功了,第二操作就算失败了,也不可能revert第一个操作吧,万一revert操作本身还失败呢。。。。