我知道就效率而言,最好有一个大查询而不是许多小查询,因为最好将与数据库的连接数量减少到最低限度(尤其是在网络流量密集的情况下)。
所以我的问题是,除了隔离和原子化一组数据库操作(如果其中一个操作失败则进行回滚)之外,事务是否像一个大查询?我的意思是,如果你需要做很多数据库操作,你能把它包装在一个事务中,然后把它变成一个单一的大操作吗?
我知道就效率而言,最好有一个大查询而不是许多小查询,因为最好将与数据库的连接数量减少到最低限度(尤其是在网络流量密集的情况下)。
所以我的问题是,除了隔离和原子化一组数据库操作(如果其中一个操作失败则进行回滚)之外,事务是否像一个大查询?我的意思是,如果你需要做很多数据库操作,你能把它包装在一个事务中,然后把它变成一个单一的大操作吗?
这种方法的问题是:你会锁定一些资源并且不利于并发。如果你在一个查询中有一个错误,那么回滚将是巨大的。
我尽量避免交易,如果可能的话,有时我需要实施某种补偿交易。
不,如果我明白你在问什么。您可以将事务视为在数据库历史记录中设置检查点,因此如果事务中的任何单个操作失败,则可以将数据库状态恢复到检查点。这是一个很大的简化,但从概念上讲,这就是事务的工作方式。
在事务中,单独的查询是单独执行的。
“一个大查询而不是许多小查询”并不总是更好或更有效。这取决于查询是什么。在一个大查询中请求一组行比一次请求一个更有效。我实际上已经看到了执行此操作的代码(伪代码):
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;
如果你需要做很多数据库操作,你能不能把它包装在一个事务中,把它变成一个单一的大操作
是的。该操作将是原子的,就像单个行更新一样。
在磁盘 I/O 方面:可能(取决于事务的大小和许多其他因素)。就您所询问的网络 I/O 而言:否。事务在服务器端实现。