@@ -11,13 +11,13 @@ ms.contentlocale: zh-CN
11
11
ms.lasthandoff : 10/25/2018
12
12
ms.locfileid : " 50022179"
13
13
---
14
- # <a name =" connection-resiliency " ></a >连接弹性
14
+ # <a name =" connection-resiliency " ></a >连接复原
15
15
16
- 连接复原自动重试失败的数据库命令。 通过提供" 执行策略" ,它封装检测故障,然后重试命令所需的逻辑,该功能可以使用与任何数据库。 EF Core提供程序可以提供定制为其特定数据库失败条件和最佳的重试策略的执行策略 。
16
+ 连接复原将自动重试已失败的数据库命令。 通过提供“ 执行策略” ,它封装检测故障,然后重试命令所需的逻辑,该功能可以应用于任何数据库。 EF Core 提供程序针对特定数据库的失败条件提供定制的执行策略,同时提供最佳的重试策略 。
17
17
18
18
例如,SQL Server 提供程序包括专门针对 SQL Server (包括 SQL Azure) 的执行策略。 它知道可以重试的异常类型,并且具有合理的默认值的最大重试,重试次数等之间的延迟。
19
19
20
- 配置您的上下文的选项时指定的执行策略。 这是通常位于 ` OnConfiguring ` 方法的派生上下文中,或在 ` Startup.cs ` ASP.NET Core 应用程序 。
20
+ 为上下文配置选项时将指定执行策略。这通常位于派生上下文的 ` OnConfiguring ` 方法中,或位于 ASP.NET Core 应用程序的 ` Startup.cs ` 中 。
21
21
22
22
[ !code-csharp[ Main] ( ../../../samples/core/Miscellaneous/ConnectionResiliency/Program.cs#OnConfiguring )]
23
23
@@ -37,13 +37,13 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
37
37
38
38
## <a name =" execution-strategies-and-transactions " ></a >执行策略和事务
39
39
40
- 会自动重试失败的执行策略需要能够播放失败的重试块中的每个操作。 启用重试次数后 ,通过 EF Core 执行每个操作将成为其自己的可重试操作。 也就是说,每个查询和每次调用 ` SaveChanges() ` 如果发生暂时性故障重试作为一个单元。
40
+ 在出现故障时自动重试的执行策略需要能够回滚失败的重试块中的每个操作。启用重试后 ,通过 EF Core 执行的每个操作都将成为其自身的可重试操作。 也就是说,如果出现暂时性故障,每个查询和对 ` SaveChanges() ` 的每次调用都将作为一个单元进行重试。
41
41
42
- 但是,如果你的代码启动了事务使用 ` BeginTransaction() ` 要定义自己的需要作为一个单元来处理的操作的组和事务内的所有内容可能需要进行播放应发生故障时。 如果您尝试执行此操作使用执行策略时 ,将收到如下所示的异常:
42
+ 但是,如果你的代码使用 ` BeginTransaction() ` 启动事务,则你将定义自己的操作组(这些操作需要被视为一个单元),并且如果发生故障,将需要回滚事务内的所有内容。如果尝试在使用执行策略时执行此操作 ,将收到如下所示的异常:
43
43
44
44
> InvalidOperationException: 配置的执行策略 SqlServerRetryingExecutionStrategy 不支持用户启动的事务。 使用由“DbContext.Database.CreateExecutionStrategy()”返回的执行策略执行事务(作为一个可回溯单元)中的所有操作。
45
45
46
- 解决方案是需要执行的委托表示的所有内容,手动调用执行策略。 如果发生暂时性故障,执行策略会再次调用委托 。
46
+ 解决方法是使用代表需要执行的所有内容的委托来手动调用执行策略。 如果发生暂时性故障,执行策略将再次调用委托 。
47
47
48
48
[ !code-csharp[ Main] ( ../../../samples/core/Miscellaneous/ConnectionResiliency/Program.cs#ManualTransaction )]
49
49
@@ -55,27 +55,26 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
55
55
56
56
一般情况下,连接失败时当前事务会回滚。 但是,如果在连接断开时在事务正在将提交所生成的事务状态为未知。 请参阅此[ 博客文章] ( https://blogs.msdn.com/b/adonet/archive/2013/03/11/sql-database-connectivity-and-the-idempotency-issue.aspx ) 的更多详细信息。
57
57
58
- 默认情况下,执行策略将重试该操作像该事务已回滚,但如果它不是这种情况将如果这导致异常的新的数据库状态不兼容,或者可能会导致** 数据损坏** 如果操作不依赖于特定状态,例如在插入新行自动生成键值。
59
-
58
+ 默认情况下,执行策略将重试该操作,就像该事务已回滚一样。但如果未这样做,当新数据库状态不兼容时,则可能导致异常;或者当操作不依赖于特定状态时(例如使用自动生成的键值插入新行时),则可能导致数据损坏。
60
59
有几种方法来解决此问题。
61
60
62
61
### <a name =" option-1---do-almost-nothing " ></a >选项 1-执行操作 (几乎) 执行任何操作
63
62
64
- 因此,可能会使应用程序直接失败,如果实际上发生这种情况可接受的事务提交过程中的连接故障的可能性较低 。
63
+ 事务提交期间连接失败的可能性很低,因此如果实际发生此情况,应用程序可能会失败 。
65
64
66
- 但是,您需要以避免使用应用商店生成的键,为了确保添加重复的行而不是引发异常。 请考虑使用客户端生成的 GUID 值或客户端的值生成器 。
65
+ 但是,需要避免使用存储生成的密钥,以确保引发异常而不是添加重复的行。 请考虑使用客户端生成的 GUID 值或客户端值生成器 。
67
66
68
67
### <a name =" option-2---rebuild-application-state " ></a >选项 2-重新生成应用程序状态
69
68
70
69
1 . 放弃当前` DbContext ` 。
71
70
2 . 创建一个新` DbContext ` 和从数据库中还原应用程序的状态。
72
- 3 . 通知用户,最后一次操作可能不具有已成功完成 。
71
+ 3 . 通知用户上次操作可能尚未成功完成 。
73
72
74
73
### <a name =" option-3---add-state-verification " ></a >选项 3-添加状态验证
75
74
76
75
对于大多数更改数据库状态的操作就可以添加代码来检查它是否成功。 EF 提供了一个扩展方法来简化此过程- ` IExecutionStrategy.ExecuteInTransaction ` 。
77
76
78
- 此方法开始和提交事务,还接受中的函数 ` verifySucceeded ` 事务提交期间发生暂时性错误时所调用的参数 。
77
+ 此方法将开始并提交事务,还将接受在事务提交期间出现暂时性错误时所调用的 ` verifySucceeded ` 参数中的函数 。
79
78
80
79
[ !code-csharp[ Main] ( ../../../samples/core/Miscellaneous/ConnectionResiliency/Program.cs#Verification )]
81
80
@@ -84,7 +83,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
84
83
85
84
### <a name =" option-4---manually-track-the-transaction " ></a >选项 4-手动跟踪事务
86
85
87
- 如果你需要使用应用商店生成的键或需要对不依赖于执行的操作处理提交失败的常规方法可以将每个事务分配提交失败时,将检查的 ID。
86
+ 如果需要使用存储生成的密钥或需要一种处理提交失败且不依赖于所执行操作的通用方法,则可以为每个事务分配一个可在提交失败时进行检查的 ID。
88
87
89
88
1 . 将表添加到用于跟踪事务的状态的数据库。
90
89
2 . 插入到表中每个事务的开始处的行。
@@ -94,4 +93,4 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
94
93
[ !code-csharp[ Main] ( ../../../samples/core/Miscellaneous/ConnectionResiliency/Program.cs#Tracking )]
95
94
96
95
> [ !NOTE]
97
- > 请确保用于验证的上下文具有定义为连接很可能会再次在验证期间失败,如果事务在提交期间失败的执行策略 。
96
+ > 请确保用于验证的上下文具有定义的执行策略,因为如果在事务提交期间连接失败,则连接可能在验证期间再次失败 。
0 commit comments