dotnet / dotnet/EntityFramework.Docs

What happens if state verification fails?

Open
#4,795 1 comment 0 reactions 1 assignee Claimed by @AndriySvyryd View on GitHub
area-connection-resiliency
Dominant language
Mermaid
Stars
1.7k
Forks
2k
Avg merge
7d 23h
Merged PRs (30d)
16

Description

### Type of issue

Missing information

### Description

As example is shown for using the `verifySucceeded` to check if the transaction was successful.

```csharp
using var db = new BloggingContext();
var strategy = db.Database.CreateExecutionStrategy();

db.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });

var transaction = new TransactionRow { Id = Guid.NewGuid() };
db.Transactions.Add(transaction);

strategy.ExecuteInTransaction(
db,
operation: context => { context.SaveChanges(acceptAllChangesOnSuccess: false); },
verifySucceeded: context => context.Transactions.AsNoTracking().Any(t => t.Id == transaction.Id));

db.ChangeTracker.AcceptAllChanges();
db.Transactions.Remove(transaction);
db.SaveChanges();
```

The documentation mentions that its likely that if the connection fails, this verifySucceeded one will fail also.
However it doesn't mention what happens in this case.

Lets say the connection drops during a transaction commit, and so the strategy retries and it invokes the `verifySucceeded` delegate to check if the transaction was indeed committed..

1. What if this check fails because the db connection is still failing? Does it end up retrying the operation anyway? Or will this surface the underying exception and prevent the execution strategy from retrying?
2. This is more of a design question checking for a possible bug. Is there a risk that when the connection originally drops during a commit - and the state of the transaction is not known to EF Core, that the retry strategy will invoke this verifySucceeded delegate - and we will check the transaction table and see that the transaction id is indeed not yet present - however the original transaction does indeed later succeed and the record will then appear afterwards? In other words can this `verifySucceeded ` check happen "too quickly" resulting in a possible duplicate insert still? If the original transaction is very large - the commit phase might take a while no?

### Page URL

https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency#execution-strategies-and-transactions

### Content source URL

https://github.com/dotnet/EntityFramework.Docs/blob/main/entity-framework/core/miscellaneous/connection-resiliency.md

### Document Version Independent Id

29002343-fa42-2f49-3362-53592039b26d

### Article author

@AndriySvyryd

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.