This is an issue that has plagued me for a while but I just got the time to make a repro.
Basically, if I try for example to invoke Transaction.execute_sql and do NOT consume the result e.g.
txn.execute_sql('DELETE from T1 WHERE 1=1')
instead of
res = txn.execute_sql('DELETE from T1 WHERE 1=1')
_ = list(res)
then the table will NOT be purged.
Seems like a bug to me with the underlying gRPC library, but it would be useful to explicitly document/call-out this bug if we don't have the bandwidth to fix it, to avoid unexpected problems for customers. It definitely sunk some hours for me in the past and also just right now.