1

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

我意识到它依赖于数据库实现。

自动提交是否意味着a)每个语句都是一个完整的事务,它直接进入磁盘或b)每个语句都是一个完整的事务,它可能会进入缓存,稍后将被刷新,或者它可能会直接进入磁盘

澄清会很棒。

4

6 回答 6

4

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

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

于 2008-10-17T21:15:41.323 回答
1

提交不保证某些内容已写入磁盘,仅保证您的事务已完成并且更改现在对其他用户可见。

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

例如,Oracle 10gR2 有几种提交模式,包括 IMMEDIATE、WAIT、BATCH、NOWAIT。BATCH 将对缓冲区的更改进行排队,写入器将在将来的某个时间将更改写入磁盘。NOWAIT 将立即返回而不考虑 I/O。

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

于 2008-10-18T00:43:11.997 回答
1

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

于 2008-10-17T21:16:34.597 回答
0

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

于 2008-10-17T21:35:06.447 回答
0

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

于 2008-10-18T07:08:16.993 回答
-1

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

于 2008-10-17T21:19:04.670 回答