【问题标题】:Transaction between SQL Azure and Azure Table StorageSQL Azure 和 Azure 表存储之间的事务
【发布时间】:2013-04-18 12:06:14
【问题描述】:
在我当前的项目中,我们正在开发一个分布式云应用程序,它将存储实体的状态和相关事件。当从队列中收到消息时,我们会更新 SQL Azure 中实体的状态,并将与该更新相关的事件保存在表存储中。
看起来像这样:
- 启动工作单元
- 在 SQL Azure 中更新实体
- 将事件保存到表存储中
- 提交事务
- 结束工作单元
我们在这里遇到的问题是我们无法在一个事务中提交 SQL Azure 和表存储中的更改。所以当 SQL Azure 中实体保存失败时,我们希望回滚表存储中的事件保存。
非常感谢任何帮助。
【问题讨论】:
-
观看this video,这真的很有趣并讨论了你的场景。虽然这不是一个直接的解决方案!但很好地洞察了“云思维”与“DTC 思维”。
标签:
sql-server
azure
transactions
azure-sql-database
azure-table-storage
【解决方案1】:
如果我了解您在以下 2 种情况下尝试涵盖的目标:
- 如果数据库插入失败,回滚 Azure 表
- 如果 Azure 表插入失败,则回滚 SQL Azure
假设您在同一个线程中执行两个请求,您是否尝试过这样的方法(伪代码)?请注意,我正在使用数据库引擎的事务功能;这与 MSDTC 不同,因为我只为单个连接执行此操作 - 所以这是受支持的。
dbConnection.BeginTransaction;
try {
// add record in database - it is in a transaction so it can be rolled back
insert_into_sqlazure;
}
catch
{
// automatic rollack - just exist with error
exit_with_error;
}
try
{
insert_into_azure_table;
dbConnection.CommitTransaction;
}
catch
{
dbConnection.Rollback;
exit_with_error;
}