【问题标题】:Python distributed transactions like Java Transaction API (JTA)Python 分布式事务,如 Java Transaction API (JTA)
【发布时间】:2013-08-28 10:52:50
【问题描述】:

是否有关于 Python 或 MySQLdb 中的分布式事务的解决方案,例如 Java Transaction API (JTA)?

我在处理多个数据库(可能是不同类型的数据库)上的数据时遇到了问题。

如何确保数据一致性?

我知道 Java 中有 Java Transaction API (JTA)。

Python 怎么做?

【问题讨论】:

  • 您可能知道,JTA 需要由应用服务器提供的 JTS,而 python 不存在所有这些东西。你至少可以看看django manages transaction
  • 是的,应用服务器。但是我找不到它。你能不能给我一些细节?

标签: python database transactions jta


【解决方案1】:

您可以使用 SQL 语句来执行 XA 事务。这不像真正的 API 那样漂亮,但它确实有效。我不知道是否有可用于 Python 的 TM(事务管理器),但您可以自己编写。

还要注意,在 Java 中,使用 XA 时不需要使用应用程序服务器。一个例子:http://bugs.mysql.com/file.php?id=22190&bug_id=75316

In [1]: import mysql.connector

In [2]: c = mysql.connector.connect(host='127.0.0.1',port=5705,user='msandbox',password='msandbox');

In [3]: cur = c.cursor();

In [4]: cur.execute("XA START 'py-xa-001'");

In [5]: cur.execute("INSERT INTO test.t1 VALUES(1)");

In [6]: cur.execute("XA RECOVER");

In [7]: print(cur.fetchone());
None

In [8]: cur.execute("XA END 'py-xa-001'");

In [9]: cur.execute("XA PREPARE 'py-xa-001'");

In [10]: cur.execute("XA RECOVER");

In [11]: print(cur.fetchone());
(1, 9, 0, u'py-xa-001')

In [12]: cur.execute("XA ROLLBACK 'py-xa-001'");

In [13]: cur.close()
Out[13]: True

In [14]: c.disconnect()

【讨论】:

    【解决方案2】:

    我自己没有使用过这个选项,但是粗略看了一下,Transaction 库似乎符合 Java 事务 API 提供的描述。它可以在pypi 中下载,并在read the docs 中记录

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2013-03-16
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多