数据库自动提交 - 它直接进入磁盘?

时间:2008-10-17 21:10:22

标签: database transactions commit

所以我知道autocommit会提交每个sql语句,但是对数据库的更新是直接进入磁盘还是保持缓存直到刷新?

我意识到这取决于数据库实现。

自动提交意味着什么 a)每个语句都是一个完整的事务,它直接进入磁盘或 b)每个语句都是一个完整的事务,它可以进入缓存区,以便稍后刷新,也可以直接进入磁盘

澄清会很棒。

6 个答案:

答案 0 :(得分:4)

自动提交只是意味着每个语句都在自己的事务中,该事务立即提交。这与“普通”模式形成对比,在“模式”中,您必须明确BEGIN一个事务,然后COMMIT完成后(通常在几个语句之后)。

短语“自动提交”与磁盘访问或缓存无关。作为一个实现细节,大多数数据库将在提交时写入磁盘以避免数据丢失,但这在规范中不是必需的。

答案 1 :(得分:1)

对于基于ARIES的协议,提交事务涉及记录在该事务中进行的所有修改。更改会立即刷新到 logfile ,但不一定会刷新到数据文件(这取决于实现)。这足以确保在发生故障时可以恢复更改。所以,(b)。

答案 2 :(得分:1)

Commit不保证已将某些内容写入磁盘,只保证您的事务已完成,并且其他用户现在可以看到更改。

永久并不一定意味着写入磁盘(即持久)......即使“提交”等待事务完成也可以配置一些数据库。

例如,Oracle 10gR2有several commit modes,包括IMMEDIATE,WAIT,BATCH,NOWAIT。 BATCH将对缓冲区进行排队更改,编写器将在以后的某个时间将更改写入磁盘。 NOWAIT将立即返回,而不考虑I / O.

commmit的确切行为是特定于数据库的,通常可以根据您对数据丢失的容忍度进行配置。

答案 3 :(得分:0)

这取决于您使用的DBMS。例如,Firebird将其作为配置文件中的选项。如果打开强制写入,则更改将直接转到磁盘。否则它们将被提交到文件系统,实际的写入时间取决于操作系统缓存。

答案 4 :(得分:0)

如果声称数据库事务是ACID,那么D(持久性)要求提交的事务应在成功提交后立即在崩溃中存活。对于单服务器数据库,这意味着它在磁盘上(磁盘提交)。对于一些现代的多服务器数据库,它也意味着事务被发送到一个或多个服务器(网络提交,通常比磁盘快得多),假设多个服务器同时崩溃的概率是小得多。

答案 5 :(得分:-1)

不可能保证提交是原子的,因此现代数据库使用两阶段或三阶段提交策略。见Atomic Commit