【问题标题】:What's the difference between a plain and XA transaction?普通交易和 XA 交易有什么区别?
【发布时间】:2014-07-10 09:04:00
【问题描述】:

我有一个关于this的问题

假设我有几个连接

$conn_site = mysqli_connect("localhost", "us", "ps");
mysqli_select_db("site", $conn_site);
$conn_forum = mysqli_connect("localhost", "us", "ps");
mysqli_select_db("forum", $conn_forum);

并且想在这些连接之间做一个事务。由于 PHP 中的 mysqli 扩展没有事务支持,我必须像这样手动完成

function begin()
{
    @mysqli_query("BEGIN", $conn_site);
    @mysqli_query("BEGIN", $conn_forum);
}

function commit()
{
    @mysqli_query("COMMIT", $conn_site);
    @mysqli_query("COMMIT", $conn_forum);
}

function rollback()
{
    @mysqli_query("ROLLBACK", $conn_site);
    @mysqli_query("ROLLBACK", $conn_forum);
}

然后使用它

begin();
mysqli_query("insert into users (....)") or rollback();
mysqli_query("insert into forumusers(....)") or rollback();
commit();

既然我手动处理状态,那么 PHP 中的普通事务和 XA 事务有什么区别?如果我在其他连接上启动普通事务,第一个事务会被 mysqli 扩展自动取消?要不然是啥?有人可以澄清一下吗?

【问题讨论】:

    标签: php mysql mysqli transactions xa


    【解决方案1】:

    很简单:如果你在第二个提交语句中失败了怎么办?第一个不能再回滚(它已经提交),因此您的一致性保证被打破。解决这个问题的正确方法是 2PC。这正是 XA 提供的。

    【讨论】:

    • 2PC 是查询 XA PREPARE 到 2 个连接 + 查询 XA COMMIT 仍然是 2 个连接。那么如果第二个COMMIT 失败了,我该如何回滚第一个提交的呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多