什么是理论&在数据库事务中运行整个php应用程序的实际缺点,以确保脚本中导致的任何意外错误或异常都会恢复数据库中的每个更改,从而避免由于未完成的脚本导致某些表已更新的状态还有一些不是吗?这显然似乎不是也不会被推荐为良好做法,但我想详细了解原因。
答案 0 :(得分:2)
数据库事务确保多个操作遵循ACID属性:
Atomic - 这是您在问题中提到的属性,即事务中的每个操作都成功,否则它们都会失败;
一致 - 此属性可确保数据库状态始终有效;
隔离 - 此属性确保并发事务(即来自不同连接)发生,就好像它们是串行执行一样;以及
持久 - 一旦提交,更改是永久性的。
为了确保隔离的第三个属性,像MySQL这样的RDBMS系统执行锁定以确保例如一个事务不写入记录而另一个事务不写入从中读取(当记录被锁定时,其他事务必须等待锁定被释放才能继续)。
如果您的交易不必要地长,则会导致过度锁定和过度等待。它甚至可能导致不必要的死锁,即事务正在等待彼此持有的锁,并且在至少一个回滚之前无法继续。
出于性能(和持久性)的原因,您应该努力保持交易尽可能小以保持一致性。