postgres 或 Mysql 如何实现事务?是通过保持连接来完成的吗?

How postgres or Mysql implement transactions? Is it done by holding on a connection?

根据我在 https://mysqlserverteam.com/mysql-connection-handling-and-scaling/ 中阅读和理解的内容

每个连接都有一个 THD 对象,我们使用它更新或插入的内容都存储在 THD 中并提交给数据库。

在交易的情况下,尤其是编程交易,我的理解是,我们保持连接直到我们完成我们的操作然后提交。同时,我们可以进行与数据库相关的更新或插入以及其他可能导致 exception/errors 的计算。 示例:

Begin;
IN-Transaction : 
    UPDATE Table-1
    c = A/B
    Insert Table-2 with c
    ... so on
Commit;

在这个程序化的事务中,我们必须传递一个事务的引用来做多个数据库操作,这个引用不是一个事务对象,而是一个连接,并且连接和事务之间存在一对一的映射语境。 如果遇到异常,我们进行回滚,DB 明白它需要丢弃与 THD 相关的更改。

我的问题是:

  1. 我的理解是否正确,如有遗漏,请帮助我!!

  2. 如果这是正确的,它是否与任何其他数据库(如 postgres 或 maria 或 voltDB)中使用的策略相同??

  3. 如果不正确,在mysql、postgres、voltDB等中是如何实现的?你能给我指出相关链接吗,我可以从中得到更好的主意!!

谢谢。

  1. 通常是:事务在单个数据库连接或数据库会话中运行:它可能以隐式方式或显式方式开始:它以特殊的 SQL 语句开始和结束。对于 PostgreSQL,请参阅 https://www.postgresql.org/docs/9.5/tutorial-transactions.html

然而,也有一些罕见的例外情况,例如使用两阶段提交协议的分布式事务,其中单个事务在不同数据库的不同会话上运行。

  1. 大多数使用 SQL 的数据库都是这样工作的,因为它是 SQL 标准所要求的。

您还必须考虑到某些客户端工具(例如用于 PostgreSQL 的 psql)或用于 Java 的 JDBC API 的默认设置会更改有点这种行为:两者都在每个语句后实现自动提交模式(这意味着每个 SQL 语句在其自己的事务中运行)但是您可以在每个工具中更改此行为。

  1. connection/session/thread/process 很大程度上取决于数据库。 MySQL 使用线程,而 PostgreSQL 使用进程:没有 SQL 声明:这非常依赖于实现。