【问题标题】:How would I make sure that data doesn't get lost if server crashes如果服务器崩溃,我将如何确保数据不会丢失
【发布时间】:2020-06-15 10:05:25
【问题描述】:

假设一个示例 API 控制器验证 JWT,然后使用 json 数据在用户之间创建事务 在这样的方法中,在整个方法执行过程中会发生多个 SELECT、UPDATE、INSERT 和 DELETE,例如获取用户资金、提取资金到临时“钱包”然后将资金添加到接收方

Say 方法会像这样进行数据库交互:1.SELECT -> 2.UPDATE -> 4.CREATE -> 5.SELECT -> 6.UPDATE -> SELECT

但如果服务器/应用程序在查询 n.4 处崩溃,则 n.6 交互将永远不会完成。

我的问题是:如何确保方法完成或将 db 恢复到崩溃前的初始状态?

我的想法是为我需要的数据创建一个“快照”,以防发生崩溃,然后将主表恢复为快照状态。如果可能的话,处理切换回该快照状态以及如何检测服务器崩溃的解决方案

【问题讨论】:

  • 阅读数据库事务
  • 什么意思?我在问如何确保数据在崩溃时恢复而不在代码中放置太多绷带
  • 那么你应该阅读有关交易的内容
  • 开始一个事务,做你所有的数据写入/更新/删除提交事务。如果提交没有发生,那么数据库实际上并没有更新docs.microsoft.com/en-us/dotnet/api/…
  • 好的,谢谢你会阅读这个

标签: c# database api server


【解决方案1】:

这是我用来介绍事务提交的代码。

using (var dbContextTransaction = dbContext.Database.BeginTransaction())
{
    try
    {
        dbContext.Database.ExecuteSqlCommand("exec xyz");
        dbContextTransaction.Commit();
    }
    catch (Exception ex) { /* Do something here with error */ }
}

您还可以在退出 using 脚本块(使用 Transaction)之前更新数据库或对 dbContext 执行多项更改。只有在运行 dbContextTransaction.Commit() 行时才会提交所有更改。否则,如果发生任何错误,所有更改都将回滚。

See MS Documentation on Transaction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2015-09-21
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多