交易是否像大查询?

时间:2012-05-11 06:29:20

标签: mysql database transactions database-optimization

我知道在效率方面最好有一个大查询而不是许多小查询,因为最好将与数据库的连接数量减少到最小(特别是在网络流量很大的情况下)。

所以我的问题是,除了隔离和雾化一组数据库操作(并在其中一个失败时进行回滚),事务行为就像一个大查询吗?我的意思是,如果你需要做很多数据库操作,你可以将它包装在一个事务中并将其转换成一个大的操作吗?

4 个答案:

答案 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而言,您要问的是:。事务在服务器端实现。