7

使用分片,如何跨多个数据库服务器维护可靠的事务?

例如,如果我有一个AccountLedger在一个数据库服务器(MySQL 实例)上命名的表和一个User在另一个数据库服务器上命名的表,是否可以跨两个数据库实例运行一个事务,该事务将可靠地提交或在失败时回滚?

交易示例:

AccountLedger 数据库服务器:

START TRANSACTION;
INSERT INTO AccountLedger SET
    UserID = @UserID,
    Date = @Date,
    Debit = @Debit,
    Balance = @Balance;

用户数据库服务器:

START TRANSACTION;
UPDATE User SET
    Balance = @Balance
WHERE UserID = @UserID;

AccountLedger 数据库服务器:

COMMIT;

用户数据库服务器:

COMMIT; -- What happens if the COMMIT fails here (power goes out or whatever)

我已经阅读了很多关于分片的内容,但我似乎找不到任何关于使用分片交易的信息。有人可以指出我正确的方向吗?

4

3 回答 3

9

使用分布式事务可以做到这一点。它们由 InnoDB 存储引擎支持。您将在 MySQL 文档中找到有关它们和命令语法的更多信息:XA Transactions

我建议不要直接使用它们。如果一致性是 ypur 应用程序的最大要求,那么使用可以处理它的事务监视器。Java EE 会为您做到这一点。

但是,如果可用性比一致性更重要,您应该避免分布式事务。CAP 定理解释了原因。

于 2012-04-07T08:01:38.270 回答
5

如果每个分片都支持每个键的线性化以及比较和设置(对于 MySQL 来说是这样),您可以在客户端实现跨分片可序列化事务。这种方法在Google 的 PercolatorCockroachDB中使用,但没有什么能阻止您在 MySQL 中使用它。

我已经创建了此类交易的逐步可视化。我希望它能帮助你理解它们。

如果您对已提交的读取隔离级别感到满意,那么看看Peter Bailis的RAMP 事务是有意义的。它们也可以在分片 MySQL 环境中实现。

于 2016-03-03T19:51:29.397 回答
0

免责声明:我为 ScaleBase (http://www.scalebase.com) 工作,这是一家完整的分片解决方案提供商

我们在 ScaleBase 提供了在 InnoDB 中使用 XA 事务的选择,尽管我们发现它们的性能成本很高……而且正是在您需要数据库最快的地方(大量插入等)。因此,我们还启用了“我们的 2 阶段提交版本”,它更快,并且在一致性方面可能被认为非常接近 XA,并且可能足以进行权衡......这个“我们的版本”包括一个对所有参与的数据库进行快速“你有空”查询,例如 SELECT version(),然后提交它们。这是我们在“ScaleBase 数据库流量控制器”中拥有的其他机制的补充,对于我们的大多数客户(以及那些不这样做的人 - 仍然可以选择完整的 XA)来说已经足够了。

于 2012-04-08T02:07:40.547 回答