I know this one's infuriating. You try to rename, delete, or move a file and Windows slaps you with ERROR_TXF_METADATA_ALREADY_PRESENT (0X00001AB3) — "Transaction metadata is already present on this file and cannot be superseded." The file might not even look locked. No process in Task Manager. No obvious culprit. But NTFS knows something's still holding a transactional claim on it.
Quick background: TXF is Transactional NTFS, the subsystem Microsoft added back in Vista so apps could do atomic file operations. It never caught on — Microsoft deprecated it in Windows 8 — but plenty of enterprise software still calls it. Backup agents, antivirus, SQL Server, and some installers all touch TXF. When one of those leaves a transaction dangling, you get this error on the next access. Here's how to clear it, most common cause first.
Cause 1: A backup or AV agent left an orphaned transaction
This is the one I see in about 70% of cases. Veeam, Backup Exec, Windows Server Backup, and most endpoint AV products use TXF to snapshot file state before they touch it. If the agent crashes mid-operation, or gets killed by a reboot during a job, the transaction record stays in $Extend\$RmMetadata\$TxfLog and the file stays marked.
The fix is not to reboot again. That won't help — TXF is designed to survive reboots. The real fix is to force the kernel to flush its transaction log.
- Stop every backup and AV service. Don't just disable the schedule. Stop the services themselves:
net stop VeeamBackupSvc,net stop WinDefend, whatever's running. - Open an elevated Command Prompt and run:
fsutil resource info C:\$Extend\$RmMetadata\$TxfLog
If you see stale GUIDs listed under active transactions, that's your smoking gun. Then run:
fsutil resource setautoreset true C:\
That tells NTFS to auto-clear transactions that no live handle owns. Restart, and the file usually behaves. If it doesn't, walk the transaction log manually with fsutil resource info C:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf and note the GUIDs.
Don't run this on a volume hosting a live Exchange database or an active SQL Server instance. Kill those services first, or you'll corrupt the log.
Cause 2: chkdsk aborted mid-run and left TXF state behind
Second most common. You ran chkdsk /f and it got interrupted — power blip, someone hit Ctrl+C, or a stuck volume. chkdsk itself uses TXF to roll forward and back; if it dies with an open transaction, the file it was working on keeps the metadata lock.
Boot into WinRE (hold Shift while clicking Restart) and run a proper offline pass. There's no shortcut here — online chkdsk /scan won't touch TXF log state.
chkdsk C: /f /r /x
Two things to watch for:
- The
/xflag forces the volume to dismount first. Without it, chkdsk refuses to run on a live system volume. - If the output shows "Deleting orphaned transaction log" or "Cleaning up minor inconsistencies," that's the fix landing. Let it finish. Don't interrupt.
On larger volumes — 2 TB and up — that run can take 6 to 12 hours with /r. If you're confident the disk is healthy, drop the /r and just use /f /x. It's much faster and rarely matters for TXF cleanup.
Cause 3: An application crashed with an uncommitted transaction
This is the sneaky one. Some line-of-business app writes a file through TXF, the process crashes hard (not a clean exit), and the transaction never commits or rolls back. The file itself is fine. The kernel resource manager just thinks the transaction's still live because the process handle got leaked instead of closed.
You can usually spot these by watching the file with Process Monitor from Sysinternals. Filter by the file path and look for IRP_MJ_CREATE operations returning STATUS_TRANSACTIONAL_CONFLICT. The process name in the event is your culprit.
To clear it without a reboot:
- Identify the owning process from ProcMon.
- Kill it with
taskkill /PID <pid> /F. A graceful close won't release the handle — TXF cleanup only runs on hard termination or process exit. - If the process is a service that auto-restarts, disable it first via
sc config <name> start=disabled, then kill it. Otherwise it respawns and grabs a new transaction before you can move the file.
If the process is a system service like svchost.exe hosting a Windows component, don't kill it blindly. Figure out which service first with tasklist /svc /fi "imagename eq svchost.exe".
What won't work
Before you waste an hour on dead ends, here's what people try that doesn't fix 0X00001AB3:
- Rebooting. TXF is persistent by design. Reboot doesn't clear it.
- Safe Mode. Same problem — the log survives.
- Taking ownership. This isn't a permissions issue. Ownership has nothing to do with the transaction state.
- Deleting and recreating the file. The transaction's not on the file, it's on the NTFS record. A new file with the same name picks up the same problem.
- Formatting. Works, obviously. Nuclear option. Don't do it unless you've got backups and you've exhausted everything above.
Quick-reference summary
| Cause | Trigger | Fix |
|---|---|---|
| Orphaned backup/AV transaction | Agent crashed mid-job | Stop services, run fsutil resource setautoreset true C:\, restart |
| Interrupted chkdsk | Power loss or Ctrl+C during chkdsk /f | Offline chkdsk C: /f /x from WinRE |
| App crash with open TXF handle | LOB app hard-terminated | Identify owner in ProcMon, hard-kill process, disable auto-restart |
One last thing. Microsoft deprecated TXF for a reason — it's fragile, underexplained, and almost nobody supports it properly. If you're writing code that hits this, don't migrate to another TXF-based approach. Move to a real transactional store (SQLite, an actual database, or just write-then-rename). And if this error keeps coming back on the same volume, that volume is telling you something. Check SMART data before you blame software.