数据库原子操作实现

Vad*_*hin 1 transaction database-internals

问题是关于未包含在“开始提交”块中的查询,而是关于 PostgreSQL、MySQL(至少是 innodb 引擎)中原子的普通插入和更新。那么这在内部是如何实现的呢?

Mar*_*ith 5

为发生在显式事务块之外的每个语句启动一个事务。是否在语句之后自动发出提交取决于 RDBMS 配置。MySQL 有自动提交选项,SQL Server 有 IMPLICIT_TRANSACTIONS,PostgreSQL 总是自动提交。

PostgreSQL :

在标准中,没有必要发出 START TRANSACTION 来启动一个事务块:任何 SQL 命令都隐式地开始一个块。PostgreSQL 的行为可以看作是在每个不遵循 START TRANSACTION(或 BEGIN)的命令之后隐式发出 COMMIT,因此它通常被称为“自动提交”。为方便起见,其他关系数据库系统可能会提供自动提交功能。

数据库

在 InnoDB 中,所有用户活动都发生在一个事务中。如果启用了自动提交模式,则每个 SQL 语句都会单独形成一个事务。默认情况下,MySQL 在启用自动提交的情况下为每个新连接启动会话,因此如果该语句没有返回错误,MySQL 会在每个 SQL 语句之后进行提交。

SQL 服务器

SQL Server 在以下事务模式下运行。

自动提交事务 - 每个单独的语句都是一个事务。

显式事务 - 每个事务都以 BEGIN TRANSACTION 语句显式开始,并以 COMMIT 或 ROLLBACK 语句显式结束。

隐式事务 - 前一个事务完成时隐式启动新事务,但每个事务都使用 COMMIT 或 ROLLBACK 语句显式完成。

  • 我不确定你是什么意思。[开始交易](http://dev.mysql.com/doc/refman/5.0/en/commit.html) 在 MySQL 中禁用自动提交。 (2认同)