Bạn không cần gọi Rollback
theo cách thủ công vì bạn đang sử dụng using
tuyên bố.
DbContextTransaction.Dispose
phương thức sẽ được gọi ở cuối using
khối. Và nó sẽ tự động khôi phục giao dịch nếu giao dịch không được cam kết thành công (không được gọi hoặc gặp trường hợp ngoại lệ). Sau đây là mã nguồn của SqlInternalTransaction.Dispose
phương thức (DbContextTransaction.Dispose
cuối cùng sẽ ủy quyền cho nó khi sử dụng trình cung cấp SqlServer):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Bạn thấy đấy, nó sẽ kiểm tra xem _innerConnection
không rỗng, nếu không, hãy khôi phục giao dịch (nếu được cam kết, _innerConnection
sẽ là null). Hãy xem Commit
gì hiện:
internal void Commit()
{
// Ignore many details here...
this._innerConnection.ExecuteTransaction(...);
if (!this.IsZombied && !this._innerConnection.IsYukonOrNewer)
{
// Zombie() method will set _innerConnection to null
this.Zombie();
}
else
{
this.ZombieParent();
}
// Ignore many details here...
}
internal void Zombie()
{
this.ZombieParent();
SqlInternalConnection innerConnection = this._innerConnection;
// Set the _innerConnection to null
this._innerConnection = null;
if (innerConnection != null)
{
innerConnection.DisconnectTransaction(this);
}
}