所以我知道自动提交会提交每个 sql 语句,但是对数据库的更新是直接进入磁盘还是保留在缓存中直到刷新?
我意识到它依赖于数据库实现。
自动提交是否意味着a)每个语句都是一个完整的事务,它直接进入磁盘或b)每个语句都是一个完整的事务,它可能会进入缓存,稍后将被刷新,或者它可能会直接进入磁盘
澄清会很棒。
所以我知道自动提交会提交每个 sql 语句,但是对数据库的更新是直接进入磁盘还是保留在缓存中直到刷新?
我意识到它依赖于数据库实现。
自动提交是否意味着a)每个语句都是一个完整的事务,它直接进入磁盘或b)每个语句都是一个完整的事务,它可能会进入缓存,稍后将被刷新,或者它可能会直接进入磁盘
澄清会很棒。
自动提交只是意味着每个语句都在其自己的事务中,该事务立即提交。这与“正常”模式形成对比,在“正常”模式下,您必须显式地BEGIN
进行事务,然后COMMIT
一旦完成(通常在几个语句之后)。
短语“自动提交”与磁盘访问或缓存无关。作为一个实现细节,大多数数据库将在提交时写入磁盘以避免数据丢失,但这在规范中不是强制性的。
提交不保证某些内容已写入磁盘,仅保证您的事务已完成并且更改现在对其他用户可见。
永久并不一定意味着写入磁盘(即持久)......即使“提交”等待事务完成,也可以配置一些数据库。
例如,Oracle 10gR2 有几种提交模式,包括 IMMEDIATE、WAIT、BATCH、NOWAIT。BATCH 将对缓冲区的更改进行排队,写入器将在将来的某个时间将更改写入磁盘。NOWAIT 将立即返回而不考虑 I/O。
commmit 的确切行为是非常特定于数据库的,并且通常可以根据您对数据丢失的容忍度进行配置。
对于基于 ARIES 的协议,提交事务涉及记录在该事务中所做的所有修改。更改会立即刷新到logfile,但不一定会刷新到 datafile (取决于实现)。这足以确保在发生故障时可以恢复更改。所以,(b)。
这取决于您使用的 DBMS。例如,Firebird将其作为配置文件中的一个选项。如果打开强制写入,更改将直接写入磁盘。否则它们被提交到文件系统,实际写入时间取决于操作系统缓存。
如果数据库事务声称是 ACID,则 D(持久性)要求提交的事务应在成功提交后立即在崩溃中幸存下来。对于单服务器数据库,这意味着它在磁盘上(磁盘提交)。对于一些现代的多服务器数据库,它也可以意味着事务被发送到一个或多个服务器(网络提交,通常比磁盘快得多),假设多个服务器同时崩溃的概率是小多了。
不可能保证提交是原子的,因此现代数据库使用两阶段或三阶段提交策略。请参阅原子提交