Mar*_*ark 5 mysql transactions sharding
通过分片,如何在多个数据库服务器之间维护可靠的事务?
例如,如果我有一个AccountLedger在一个数据库服务器(MySQL实例)上命名的表和一个User在另一个数据库服务器上命名的表,是否可以跨两个数据库实例运行一个事务,该事务既可以可靠地提交,也可以在失败时回滚?
示例交易:
AccountLedger数据库服务器:
START TRANSACTION;
INSERT INTO AccountLedger SET
UserID = @UserID,
Date = @Date,
Debit = @Debit,
Balance = @Balance;
Run Code Online (Sandbox Code Playgroud)
用户数据库服务器
START TRANSACTION;
UPDATE User SET
Balance = @Balance
WHERE UserID = @UserID;
Run Code Online (Sandbox Code Playgroud)
AccountLedger数据库服务器:
COMMIT;
Run Code Online (Sandbox Code Playgroud)
用户数据库服务器
COMMIT; -- What happens if the COMMIT fails here (power goes out or whatever)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多关于分片的内容,但我似乎无法找到有关使用分片的事务的任何信息.有人能指出我正确的方向吗?
可以使用分布式事务执行此操作.它们由InnoDB存储引擎支持.您将在MySQL文档中找到有关它们的更多信息以及命令的语法:XA Transactions
我建议不要直接使用它们.如果一致性是ypur应用程序的最大要求,那么使用可以处理它的事务监视器.Java EE为您做到了这一点.
但是,如果可用性比一致性更重要,则应避免分布式事务.CAP定理解释了原因.
如果每个分片支持每个键的线性化和比较和设置(这对于 MySQL 是正确的),您可以在客户端实现跨分片可序列化事务。这种方法用于Google 的 Percolator和CockroachDB使用,但没有什么可以阻止您将它与 MySQL 一起使用。
我已经创建了一个分步可视化此类交易的。我希望它能帮助你理解它们。
如果您对读取提交的隔离级别感到满意,那么查看Peter Bailis 的RAMP 事务是有意义的。它们也可以在分片 MySQL 环境中实现。
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |