我知道在效率方面最好有一个大查询而不是许多小查询,因为最好将与数据库的连接数量减少到最小(特别是在网络流量很大的情况下)。
所以我的问题是,除了隔离和雾化一组数据库操作(并在其中一个失败时进行回滚),事务行为就像一个大查询吗?我的意思是,如果你需要做很多数据库操作,你可以将它包装在一个事务中并将其转换成一个大的操作吗?
答案 0 :(得分:2)
这种方法的问题是:你将锁定一些资源,这对并发性有害。如果在一个查询中有一个错误,则回滚将是巨大的。
我尽量避免交易,有时我需要实施某种补偿交易。
答案 1 :(得分:2)
不,如果我明白你在问什么。您可以将事务视为在数据库历史记录中设置检查点,因此如果事务中的任何单个操作都失败,则可以将数据库状态还原到检查点。这是一个很大的简化,但概念上就是交易的运作方式。
在一个事务中,各个查询是分开执行的。
拥有“一个大问题而不是许多小问题”并不总是更好或更有效。这取决于查询的内容。在一个大查询中请求一组行而不是一次请求一个行更有效。我实际上已经看到了这样做的代码(伪代码):
SELECT id FROM people WHERE ... ORDER BY lastname;
for each (id) {
SELECT firstname, lastname, phone from people WHERE id = {id};
...
}
这会更有效率
SELECT id, firstname, lastname, phone FROM people WHERE ... ORDER BY lastname;
答案 2 :(得分:1)
如果您需要进行许多数据库操作,可以将其包装在事务中并将其转换为单个大型操作
是。该操作将是原子操作,就像单行更新一样。
答案 3 :(得分:0)
就磁盘I / O而言:可能(取决于事务的大小和众多其他因素)。 就网络I / O而言,您要问的是:否。事务在服务器端实现。