Anyone who’s spent serious time managing Oracle in a high-concurrency production environment has a blocking transaction story. Mine involved a Friday afternoon, a long-running report that someone kicked off without thinking, and a payment processing queue that stacked up for eighteen minutes while I hunted down the blocker, confirmed it was safe to kill, and ran the ALTER SYSTEM command. Eighteen minutes doesn’t sound catastrophic until you’re the one explaining it to the business.
Oracle 23c’s Automatic Transaction Rollback is aimed directly at that scenario. The idea is simple enough: let the database handle blocker resolution automatically, based on priority rules you define, instead of waiting for a DBA to notice, investigate, and intervene. The execution is more nuanced than it sounds, and there are real considerations before you turn this on in production. Let me walk through how it actually works.
Why Manual Blocker Resolution Has Always Been Painful
Row-level locking is fundamental to how Oracle maintains consistency. When a session runs an INSERT, UPDATE, DELETE, MERGE, or SELECT FOR UPDATE, it holds locks on the affected rows until the transaction commits or rolls back. That’s not a bug — it’s the whole point. But it becomes a problem when a low-priority transaction sits on locks that a high-priority transaction urgently needs.
The traditional DBA workflow for this situation goes something like:
Query V$SESSION and V$TRANSACTION to find who’s blocking whom. Figure out whether the blocker is doing something legitimate or just sitting idle. Make a judgment call about whether killing it will cause problems. Run ALTER SYSTEM KILL SESSION and hope you got the right one. Repeat as needed.
That process is reactive by nature. By the time you’ve identified the blocker and acted on it, the business impact has already happened. The SLA breach, the queued transactions, the customer-facing slowdown — those are already in the rearview mirror. You resolved the problem, but you didn’t prevent it.
Automatic Transaction Rollback shifts this from reactive to proactive. The database enforces priority rules in real time, without waiting for anyone to notice.
How the Priority System Works
The model is straightforward. Transactions get assigned one of three priority levels: HIGH, MEDIUM, or LOW. You set this at the session level:
sql
ALTER SESSION SET TRANSACTION_PRIORITY = HIGH;
The default is HIGH if you don’t set anything, which means existing applications without explicit priority assignments will behave as before until you introduce lower-priority designations for appropriate workloads.
The hierarchy determines who can roll back whom:
- A HIGH-priority transaction can trigger rollback of MEDIUM or LOW blockers
- A MEDIUM-priority transaction can trigger rollback of LOW blockers
- LOW-priority transactions don’t get to terminate anyone
The other half of the configuration is the wait target — how long a higher-priority transaction waits before the database takes action against its blocker:
sql
ALTER SYSTEM SET HIGH_PRIORITY_WAIT_TARGET = 15;
That’s 15 seconds. A HIGH-priority transaction blocked by something lower-priority will wait up to 15 seconds, and if the block isn’t resolved naturally by then, Oracle rolls back the blocker automatically. You can configure this at the system level, at the PDB level, or per RAC instance, which gives you reasonable flexibility for environments where different workloads have different tolerance thresholds.
The range Oracle supports for wait targets runs from 1 second up to 2,147,483,647 seconds. You’re unlikely to need the upper bound. The interesting decisions are at the lower end — how aggressive do you actually want to be?
Track Mode: The Feature I’d Insist On Using First
Before you enable actual rollback behavior in any production environment, there’s a simulation mode called Track Mode that deserves more attention than it usually gets in Oracle documentation.
In Track Mode, the database evaluates every blocking scenario against your configured priority rules and records what would have happened — which transactions would have been rolled back, when, and why — without actually doing anything. No sessions get killed. No transactions get rolled back. You just get the data.
This matters for a few reasons. Priority-based rollback interacts with things you might not anticipate: batch jobs that temporarily block but complete quickly, legacy application patterns that weren’t designed with priorities in mind, edge cases where an apparently low-priority session is actually doing something the business cares about. Track Mode lets you discover these before you’ve rolled back something important and triggered a support escalation.
My strong recommendation: run Track Mode for at least a few weeks across different business cycles before switching to live rollback. Analyze V$SYSSTAT for the “potential rollback” counters, review the alert log entries, and make sure the policy you’ve designed matches the reality of how your workloads actually behave.
What Visibility Looks Like in Practice
The monitoring story for this feature is decent. V$TRANSACTION now surfaces transaction priorities and wait targets alongside the blocking information you’d already be querying. The alert log records rollback events with enough context to reconstruct what happened: session ID, transaction ID, priority level, what got terminated and why, and the wait target that triggered the action.
V$SYSSTAT adds counters for both modes:
In Rollback Mode, you’ll see HIGH-priority rollbacks and MEDIUM-priority rollbacks accumulating as the feature operates. In Track Mode, the equivalent “potential rollback” counters tell you what the live policy would have done.
These counters are useful for tuning. If you’re seeing a high rate of potential rollbacks in Track Mode, you might need to reconsider how aggressively you’ve classified your workloads, or whether your wait targets are set appropriately for your normal blocking patterns.
How This Differs From Resource Manager
If you’ve used Oracle Resource Manager for blocking control, you’ll notice some overlap in intent but a meaningful difference in approach. Resource Manager’s controls — MAX_EST_EXEC_TIME, MAX_IDLE_TIME, MAX_IDLE_BLOCKER_TIME — operate on session-level characteristics. How long has this session been running? How long has it been idle? Is it blocking while idle?
Automatic Transaction Rollback operates on business priority. It’s not asking how long a transaction has been running — it’s asking whether this transaction should yield to that one based on which workload matters more. That’s a different question, and for mixed-workload environments where you have batch jobs, reports, and transactional processing sharing the same database, it’s often the more useful question.
The two mechanisms aren’t mutually exclusive. You can run both, and in complex environments, you probably should.
Things to Think Through Before Enabling This
A few considerations that don’t always surface in feature announcements:
Priority assignment needs to be deliberate. Since HIGH is the default, applications that don’t explicitly set a priority will run as HIGH. If everything is HIGH, the feature does nothing useful. You need to actually go through your workload landscape, identify what genuinely needs priority treatment, and set MEDIUM or LOW appropriately for everything else. That’s an operational process, not a database configuration.
Rollback has costs. When Oracle rolls back a transaction, the rolled-back session gets an error and its work is undone. If the application isn’t designed to handle that gracefully — retry logic, appropriate error handling — you’ll get a different kind of problem replacing the original one. Review how your lower-priority applications respond to unexpected rollbacks before going live.
Wait targets require tuning. An aggressive wait target (say, 5 seconds) in an environment with normally fast transactions might be fine. In an environment where MEDIUM-priority batch work legitimately holds locks for longer periods as part of normal operation, 5 seconds will generate constant rollbacks that aren’t actually improving anything. Start conservative and tune based on Track Mode data.
Test across business cycles. Month-end processing, batch windows, peak transaction periods — these create different blocking patterns than a typical Tuesday afternoon. Track Mode data from one week might not represent the full range of scenarios you need to plan for.
Where This Actually Helps
For environments that match the intended use case — mixed-priority workloads, recurring blocking contention, DBAs spending meaningful time on manual blocker resolution — Automatic Transaction Rollback is a genuine operational improvement. It won’t make blocking contention disappear, because the underlying causes (long-running transactions, poor application locking patterns, resource contention) are still there. What it does is remove the human from the resolution loop for the scenarios where priority rules can make the call automatically.
That’s valuable. The eighteen-minute payment processing queue scenario I started with — in an environment with this feature configured correctly, it resolves in 15 seconds instead of 18 minutes. That’s the delta. Whether that delta matters enough to justify the configuration effort and the operational care required to do it right is something you’d have to evaluate against your own environment.
For high-concurrency, mission-critical Oracle deployments where blocking contention is a recurring problem and the workload mix is well-understood, it almost certainly does.




