Postgres或Mysql如何实现事务?是否通过保持连接来完成?

问题描述 投票:0回答:1

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

每个连接都有一个THD

对象,我们使用该对象进行的更新或插入的内容都存储在THD中并提交给DB。

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

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

在此程序化事务中,我们必须传递用于执行多个数据库操作的事务的引用,并且该引用不是事务对象,而是连接,并且连接和事务上下文之间存在一对一的映射。如果遇到异常,我们将进行回滚,并且数据库了解它需要放弃与THD相关的更改。

我的问题是:

  1. 我的理解正确吗,如果有什么遗漏,请帮助我!!

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

  3. 如果不正确,如何在mysql,postgres,voltDB等中实现?您能指出我相关的链接吗?

  4. 谢谢。

    根据我在https://mysqlserverteam.com/mysql-connection-handling-and-scaling/中阅读和理解的内容,每个连接都有一个THD对象,而我们使用它更新或插入的对象都存储在THD中...] >

    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语句:这完全取决于实现。
mysql postgresql transactions database-connection spring-transactions
1个回答
0
投票
  1. 通常,是的:事务在单个数据库连接或数据库会话中运行:它可以以隐式或显式方式启动:以特殊的SQL语句开始和结束。对于PostgreSQL,请参见https://www.postgresql.org/docs/9.5/tutorial-transactions.html

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

  1. 大多数使用SQL的数据库都以这种方式工作,因为SQL标准要求它。
© www.soinside.com 2019 - 2024. All rights reserved.