¿Por qué se confirma una transacción anidada incluso si nunca se llama a TransactionScope.Complete ()?

staba probando para ver cómo funcionan las transacciones anidadas, y descubrí este comportamiento perturbador e inesperado.

using(TransactionScope otx = new TransactionScope())
using(SqlConnection conn1 = new SqlConnection("Server=S;Database=DB;Trusted_Connection=yes"))
using(SqlCommand cmd1 = conn1.CreateCommand())
{
    conn1.Open();
    cmd1.CommandType = CommandType.Text;
    cmd1.CommandText = "INSERT INTO FP.ACLs (ChangeToken,ACL) VALUES (1,0x)";
    cmd1.ExecuteNonQuery();

    using(TransactionScope itx = new TransactionScope(TransactionScopeOption.RequiresNew))
    using(SqlConnection conn2 = new SqlConnection("Server=S;Database=DB;Trusted_Connection=yes"))
    using(SqlCommand cmd2 = conn1.CreateCommand())
    {
        conn2.Open();
        cmd2.CommandType = CommandType.Text;
        cmd2.CommandText = "INSERT INTO FP.ACLs (ChangeToken,ACL) VALUES (2,0x)";
        cmd2.ExecuteNonQuery();
        // we don't commit the inner transaction
    }

    otx.Complete(); // nonetheless, the inner transaction gets committed here and two rows appear in the database!
}

Yo viesta otra pregunta, pero la solución no se aplicó.

Si no especifico TransactionScopeOption.RequiresNew (es decir, no uso una transacción anidada, solo un alcance anidado), entonces toda la transacción se revierte cuando no se completa el alcance interno y se produce un error al llamar a otx. Completar(). Esto esta bien

¡Pero ciertamente no espero que se confirme una transacción anidada cuando no se completó con éxito! ¿Alguien sabe qué está pasando aquí y cómo puedo obtener el comportamiento esperado?

La base de datos es SQL Server 2008 R2.

Respuestas a la pregunta(2)

Su respuesta a la pregunta