MySQL中的分片和事务处理

7

使用分片技术,如何在多个数据库服务器之间保持可靠的事务?

例如,如果我在一个数据库服务器(MySQL实例)上有一个名为 AccountLedger 的表,在另一个数据库服务器上有一个名为 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;

账户总账数据库服务器:

COMMIT;

用户数据库服务器:

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

我已经读了很多关于分片的内容,但似乎找不到任何关于在分片中使用事务的信息。能否有人指点一下方向?

3个回答

9
可以使用分布式事务实现这一点。它们由InnoDB存储引擎支持。在MySQL文档中可以找到有关它们和命令语法的更多信息:XA Transactions
我建议不要直接使用它们。如果一致性是您的应用程序最重要的要求,请使用可以处理它的事务监视器。Java EE为您提供了这种功能。
然而,如果可用性比一致性更重要,则应避免使用分布式事务。CAP定理解释了其中的原因。

5
如果每个分片都支持每个键的线性可比性和比较并设置(这对于MySQL是正确的),则可以在客户端上实现跨分片可序列化事务。 Google's PercolatorCockroachDB 中使用了这种方法,但没有什么阻止您在MySQL中使用它。
我创建了一个逐步可视化此类交易。希望它能帮助您理解它们。
如果您对读取提交的隔离级别满意,则有意义查看Peter Bailis的RAMP transactions。它们也可以在分片的MySQL环境中实现。

0

声明:我在ScaleBase(http://www.scalebase.com)工作,提供分片的完整解决方案。

我们在ScaleBase中提供了使用InnoDB中XA事务的选择,尽管我们发现它们可能会影响性能...而且恰好是您需要数据库最快的地方(大量插入等)。因此,我们还启用了“我们版本的2阶段提交”,它更快,并且在一致性方面可以被认为非常接近XA,并且可能足以进行权衡...这个“我们版本”包括一个快速的“您是否可用”的查询,例如SELECT version()到所有参与的数据库,然后将它们提交。这加上我们在“ScaleBase数据库流量控制器”中拥有的其他机制足以满足我们大多数客户的需求(那些不需要的客户仍然可以选择完整的XA)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接