Anda tidak perlu menelepon Rollback secara manual karena Anda menggunakan using penyataan.
DbContextTransaction.Dispose metode akan dipanggil di akhir using memblokir. Dan secara otomatis akan mengembalikan transaksi jika transaksi tidak berhasil dilakukan (tidak dipanggil atau ditemui pengecualian). Berikut adalah source code dari SqlInternalTransaction.Dispose metode (DbContextTransaction.Dispose akhirnya akan mendelegasikannya saat menggunakan penyedia SqlServer):
private void Dispose(bool disposing)
{
// ...
if (disposing && this._innerConnection != null)
{
this._disposing = true;
this.Rollback();
}
}
Anda lihat, ia memeriksa apakah _innerConnection bukan null, jika tidak, kembalikan transaksi (jika berkomitmen, _innerConnection akan menjadi nol). Mari kita lihat apa yang Commit melakukan:
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);
}
}