Goku, since your question makes use of Linq to SQL, then I will only consider the transactions involving Database and I will disregard transactions with installed objects.
So, to get the good use of a Transaction, we must respect ACID.:
Atomicity: A transaction must be an atomic unit of work; or all of your data modifications are performed or
none of them is executed.¹
Since transactions must be atomic and for good practice methods must have a sole responsibility, then it is interesting to have only one Transaction per method.
Consistency: When complete, a transaction must leave all data in a consistent state. In a relational database,
all rules must be applied to the transaction modifications for
integrity of the data. All data structures
such as tree indexes B or double lists
should be correct at the end of the transaction.¹
Isolation: Changes made by concurrent transactions must be isolated from modifications made by any other transaction
simultaneously. A transaction recognizes the data as it was
before another concurrent transaction has modified them or recognizes the
data after the second transaction has been completed but not
recognizes an intermediate state. This is called serializability
because it results in the ability to recharge the initial data and
re-run a series of transactions so that the data obtained
are in the same state as they were after transactions
1 were executed.
Durability: Once a transaction has been completed, its effects stay permanently on the system. Modifications persist
even in the event of a system crash.¹
So with this in mind, then perhaps your method would make the best use of TransactionScope if it were implemented as follows:
ModeloColDataContext dm = DataContextFactory.GetContext(usuario);
{
if (documento > 0)
{
try
{
using (TransactionScope tr = new TransactionScope())
{
var updateDocumento = dm.ExecuteQuery<String>(@"
UPDATE TABELA_DOCUMENTOS
SET CLIENTE = {0}
WHERE CLIENTE = {1} AND DOCUMENTO = {2}
", clienteNovo, clienteAtual, documento);
if (updateDocumento == valorEsperado)
{
// realiza mais algunas operações no Banco
// note, caso o updateDocumento não tenha o valor esperado ou ocorra algum erro durante as consultas posteriores, o "UPDATE TABELA_DOCUMENTOS..." será desfeito.
tr.Complete();
}
}
}
catch (Exception err)
{
//realiza algum tratamento para o erro
}
}
}
However, if your DMLs commands are completely independent and should be persisted regardless of the result of the others (which is what is happening in your example), then there is no need to use TransactionScope, after all your operations do not need be Atomic.
P.S .: another point that I found strange in your example was the non-parameterization of the query. When parameterizing you gain in security (avoids SQL injection) and performance (the bank can put the execution plan of the query in cache).
¹ - Transactions (Bank Mechanism of Data)