I know seeing ERROR_TRANSACTION_NOT_REQUESTED (0X00001A2F) is frustrating — especially when you're sure you started a transaction. I've been there, staring at logs wondering where the context went. Let's fix this.
The Quick Fix
Stop whatever code is hitting COMMIT or ROLLBACK without a matching BEGIN TRANSACTION. In most cases, the stack trace points to a stored procedure or an ORM like Entity Framework. Here's the pattern for SQL Server:
-- Wrong: no BEGIN TRAN before COMMIT
BEGIN TRY
-- some update or insert
COMMIT TRANSACTION; -- ERROR_TRANSACTION_NOT_REQUESTED fires here
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION; -- or here
END CATCH
-- Right:
BEGIN TRANSACTION;
BEGIN TRY
-- your DML here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCHIf you're using ADO.NET, check you called connection.BeginTransaction() before assigning the transaction to a command:
using (var connection = new SqlConnection(connString))
{
connection.Open();
using (var transaction = connection.BeginTransaction()) // you need this
using (var command = connection.CreateCommand())
{
command.Transaction = transaction; // also critical
command.CommandText = "UPDATE table SET col = 1 WHERE id = 5";
command.ExecuteNonQuery();
transaction.Commit();
}
}Check the command.Transaction assignment — I've seen people forget that line and get 0X00001A2F every time.
Why This Happens
The error code 0X00001A2F maps directly to ERROR_TRANSACTION_NOT_REQUESTED in the Windows NT status codes. SQL Server and some ODBC drivers raise it when your session tries to commit or rollback a transaction that never started, or that already completed (committed or rolled back). The transaction count goes to zero or negative, and the engine says “nope, nothing to do here.”
Real-world trigger: I once worked on a legacy app where a C# stored procedure wrapper called ROLLBACK in an error handler even when the procedure hadn't explicitly started a transaction — because the caller already handled it. The nested ROLLBACK killed the outer transaction and then threw this error on the next COMMIT. Took hours to trace.
Less Common Variations
Implicit Transactions in SQL Server
If SET IMPLICIT_TRANSACTIONS ON is active, every statement auto-starts a transaction. But if you later run COMMIT when nothing implicitly started (e.g., a SELECT that doesn't count), you'll get the error. Disable implicit transactions unless you really need them:
SET IMPLICIT_TRANSACTIONS OFF;
-- or check @@OPTIONS to see if it's onLinked Server or Distributed Transactions
The error can pop up when using linked servers with distributed transactions and the MSDTC service isn't configured correctly. In those cases, a BEGIN DISTRIBUTED TRANSACTION might fail silently, leaving the local transaction count at zero. Then when you try to COMMIT, you get the error. One fix: ensure MSDTC is running and network access is allowed. Or avoid distributed transactions by using OPENQUERY with SET XACT_ABORT ON.
Entity Framework / LINQ to SQL
EF often wraps operations in implicit transactions. If you call SaveChanges() inside a manually opened transaction that wasn't assigned to the context, you can hit this. The trick: use context.Database.UseTransaction() to link your existing transaction to the EF context:
using (var transaction = connection.BeginTransaction())
{
context.Database.UseTransaction(transaction);
// make changes
context.SaveChanges();
transaction.Commit();
}Prevention Going Forward
I always add a quick check before commit or rollback in scripts. In SQL Server, you can test @@TRANCOUNT:
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
ELSE
PRINT 'No open transaction to commit — skipping.';In application code, wrap your transaction logic in a using block or try/finally so the transaction object is never null when you call commit. Also, log the transaction state at each step during development — it catches mismatched begin/commit pairs early. Code reviews should flag any stored procedure that calls COMMIT or ROLLBACK without a matching BEGIN. That's where most of these bugs hide.