【问题标题】:How postgres or Mysql implement transactions? Is it done by holding on a connection?postgres或Mysql如何实现事务?是通过保持连接来完成的吗?
【发布时间】:2020-09-02 13:35:42
【问题描述】:

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

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

对于事务,尤其是程序化事务,我的理解是,我们保持连接,直到我们完成我们的操作然后提交。同时,我们可以进行与数据库相关的更新或插入以及其他可能导致一些异常/错误的计算。 示例:

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等中是如何实现的?你能指出我可以得到更好主意的相关链接吗!!。

谢谢。

【问题讨论】:

    标签: mysql postgresql transactions database-connection spring-transactions


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

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

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

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

    1. 连接/会话/线程/进程在很大程度上取决于数据库。 MySQL 使用线程,而 PostgreSQL 使用进程:没有 SQL 语句:这非常依赖于实现。

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2015-08-19
      • 2011-08-31
      相关资源
      最近更新 更多