我读了一些关于何时应该使用交易的文章。我读到了:
我应该何时使用交易? 基本上,只要您的某个工作单元对外部更改敏感或需要能够回滚每个更改, 发生错误或其他原因。
但有人可以向我解释一下吗?
感谢您的帮助!
答案 0 :(得分:4)
当您拥有一组彼此依赖的查询时,将使用事务。
例如,银行:
Start transaction
UPDATE accounts SET balance=balance-100 WHERE account='John'
UPDATE accounts SET balance=balance+100 WHERE account='Alice'
commit
在您提交事务之前,不会保存事务。因此,如果任一查询中出现错误,您可以调用rollback
并撤消自事务启动以来运行的所有查询。如果由于某种原因,向Alice添加100美元的查询失败,您可以回滚而不是从John扣除100美元。这是一种确保您可以根据需要自动撤消查询的方法。
当我执行两个或更多删除/更新/插入查询时,我应该启动一个事务吗?
取决于查询的内容。
当我只有一个删除/更新/插入查询时,我是否也应该启动一个事务?
除非你需要一种回滚(撤销)查询的方法,就像你想要进行更新并在调用commit(save)之前验证它一样。
我应该在一个页面上开始10次交易,或者对整个页面只开一次,或者你是否建议每页最多一次(例如5)?
尽可能多地开始。我怀疑你每页有多个交易,因为你很可能在每个页面加载时做一件事(即转账)。
答案 1 :(得分:1)
只要您需要执行一组相关查询,就像使用一次查询一样,就可以使用事务。
例如:
在购物车中,有人为产品广告,更新商店库存(减少存在),并更新客户的购物车(增加购物车上的产品)。在这种情况下,会发生2次操作,这就是您创建事务的原因,如果其中一个查询失败(商店中的产品不足),则第二个查询不应发生(将产品添加到客户的购物车中)。在这种情况下,2个查询符合一个工作单元,这意味着数据库应该处理两个或不处理。
现在,考虑到你的观点,我没有看到使用事务执行无关查询的可靠理由(除非有特殊需要)。根据您使用的数据库引擎,您正在开发不必要的事务的系统将产生性能瓶颈。
另一方面,可能有些应用程序可能需要执行多个事务,但这是您应根据具体情况决定的事情,因为没有一般规则。
关于限制每页交易量的问题,或者每页只创建一个交易,我只能说这取决于你想要实现的目标。您可能需要执行10个相关查询,这些查询应该在失败时一起回滚,然后您需要一个事务。如果您需要运行许多不相关的查询而无需回滚,则意味着您甚至不需要进行交易。
您还可以查看维基百科关于此主题的条目: