С SubSonic вы должны объединить TransactionScope и SharedDbConnectionScope.
В противном случае каждая команда будет использовать свое собственное выделенное соединение, которое удаляется после выполнения, что приведет к неявной фиксации (по крайней мере, для MySQL и Sql Server).
Каждый запрос SubSonic в SharedDbConnectionScope будет использовать одно и то же соединение, поэтому вы можете использовать TransactioScope.
И вы должны использовать SharedDbConnectionScope перед TransactionScope, иначе некоторые провайдеры не обнаружат, что вы выполняете транзакцию.
using (new SharedDbConnectionScope())
{
using (TransactionScope ts = new TransactionScope()
{
// Do some sh*i ;)
ts.Complete();
}
}