【问题标题】:database atomic operations implementation数据库原子操作实现
【发布时间】:2013-07-22 21:57:00
【问题描述】:

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

【问题讨论】:

  • "Plain" 插入和更新在隐式事务(隐式 BEGIN...COMMIT 块)的上下文中运行。真的没有区别。
  • 我猜你应该把这个写成答案,而不是评论——它会被接受
  • 我把它写成答案,并链接到文档。

标签: database database-design


【解决方案1】:

所有 DML 语句都在事务的上下文中运行——显式事务 (BEGIN...COMMIT) 或隐式事务。我很确定这适用于所有 SQL dbms。肯定是true for PostgreSQL

默认情况下(没有 BEGIN),PostgreSQL 在 “autocommit”模式,即每条语句都以自己的方式执行 事务和提交在结束时隐式执行 语句(如果执行成功,则执行回滚)。

【讨论】:

  • 顺便问一下,如果自动提交模式关闭了怎么办?是否有任何语句包含在 begin ... commit 中?
  • 除了嵌入式 SQL 之外,您无法真正将其关闭。 (嵌入式 SQL 的默认设置是关闭。) BEGIN 具有关闭它的效果; PostgreSQL 将等待 COMMIT 或 ROLLBACK。
  • 嗯,我可以在 mysql 的设置中做这件事——我真的不能在 postgres 中做同样的事情吗?那么关于mysql的问题:如果autocommit设置为0呢?
  • 你不能在 PostgreSQL 中以同样的方式方式。如果您set autocommit=off,您会得到“错误:不再支持 SET AUTOCOMMIT TO OFF”。在 PostgreSQL 中,可以通过使用 BEGIN 或 START TRANSACTION 来“关闭自动提交”。在 MySQL 中,如果 autocommit 关闭,任何 SQL DML 都会隐式启动事务,您必须 COMMIT 或 ROLLBACK 才能完成它。
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多