在我当前的项目中,我们正在开发一个分布式云应用程序,该应用程序将存储实体的状态和相关事件。当从队列接收到消息时,我们更新SQL Azure中实体的状态,并将与该更新相关的事件保存在表存储中。
它看起来像这样:
- UnitOfWork开始
- 更新SQL Azure中的实体
- 将事件保存到表存储 <
- 提交事务/gh>
- 结束UnitOfWork
我们在这里遇到的问题是,我们不能在一个事务中提交SQL Azure和表存储中的更改。因此,当在SQL Azure中保存实体失败时,我们希望回滚在表存储中保存事件。
如果我理解你的目标,你是在试图涵盖以下两种情况:
- 如果DB插入失败,回滚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;
}