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);
}
}