我们在rollback一段DML操作或DML操作失败后,都会自动进行回滚。所以你必须耐心等待事务回滚结束后,才能再次进行DML操作,否则将会死锁。但是回滚是系统自动完成的,我们应该如何去得知回滚进度呢?看下面的实验
1. 新建一个千万级数据量表test2;
2. 删除test2
DELETE FROM test2;
3. 观察事务使用数据块的情况:
SELECT t.USED_UBLK,t.XIDUSN FROM v$transaction t;
4. 当使用了上百万的数据块后,我们点击小闪电中断操作(注意点击小闪电后貌似没反应,其实就开始回滚了,此时在v$session中还是能查到删除动作的session,此时它并不是在删除,而是在回滚。这跟你在sqlplus里执行脚本,然后关闭窗口的原理一样,不要错误认为,你明明关了窗口,为什么操作还在进行,其实它已经中断了,而是在回滚!),在接着看
SELECT t.USED_UBLK FROM v$transaction t;
你会发现USED_UBLK越来越少,这表示它就在回滚,直到变成0为止。会发现这样一种现象:事务越大(USED_UBLK越大),回滚的越慢!所以在做大数据量DML操作时,一定要考虑到这个风险:万一失败,回滚的时间将很漫长!!!!