事务
原子性:要么全做,要么不做
一致性:事务前和后数据库状态有一致性
隔离性:事务中的临时状态对外部隔离,不可见
持久性:事务造成的改变持久
事务的开始:DML/DDL语句或者SET TRANSACTION
事务开始后,oracle给该事务分配一个可用的undo data段,分配完才会产生transaction id。
事务的结束:
Commit/rollback语句
DDL语句 create/drop/rename/alter 数据库在每条DDL前后隐式的commit
用户正常退出,导致当前事务隐式提交
用户进程异常中止,导致事务回退
Oracle支持语句级原子性,一个sql语句是一个原子单位。
SCN (system change number)是oracle内部使用的逻辑时间戳。Oracle在SGA中对SCN进行加一操作。当一个事务修改数据,数据库对分配给该事务的undo数据段写一个新的SCN号。
事务控制语句:commit, rollback, savepoint
SET TRANSACTION NAME xxx
事务名便于监控运行时间长的事务,写入LogMiner,方便查找(V$TRANSACTION)。
Active transaction: transaction开始后,没有提交或回退前的状态。
在事务开始后,
1. oracle 产生undo data,放在SGA.
2. oracle产生redo欣喜,放在SGA中的online redo log buffer
3. 数据修改放到了SGA中的database buffer。并不是被DBWn立即写到data file中
4. 和数据修改相关的行被锁住。
Savepoint: 回退到一个savepoint意味着该savepoint以后的操作都回退,但该事务本身并不回退,也就是savepoint之前的操作依然可以选择commit or rollback。
Oracle保留rollback to savepoint语句中指定的这个savepoint,但之后的savepoint都会丢失。
Oracle释放该savepoint之后所有的表锁和行锁,但仍保留该savepoint之前的数据锁。
当事务回退到某个savepoint,其他在等待资源的事务可能还在等待。因为当一个事务等待另一个事务锁住的资源时,它就会在该事务后排队,尽管该事物可能rollback to savepoint,并且释放了资源。
Rllback操作:
1. 用undo段信息undo所有的操作.事务表中每一个active事务都有指针指向该事务对应得undo data。数据库读取undo data,反向修改数据,然后将undo entry标成applied。
2. 释放该事务拿的锁
3. 取消事务中所有savepoint
4.结束事务
Commit操作:
1. 为commit操作产生一个SCN号。内部的事务表纪录该事物已经提交,并把分配的SCN号纪录在表中。
2. LGWR (log writer)进程把redo log buffer中剩下的redo log entries和SCN号写入online redo log。
3. oracle释放对表和行的锁。
4. oracle删除savepoint.
5. oracle执行commit cleanout,将事务的锁相关信息从SGA block中删除
6. oracle标记该事务结束
通常来说commit操作是很快的,不和修改数据量成正比增长。最花时间的部分是LGWR进行的物理i/o。
Autonomous transaction自治事务,不管调用它的事务是提交还是回退,自治事务独立运行。
1. 它看不到主事务的未提交操作,不共享锁或者资源
2. 自治事务中的操作在提交后,对其他事务可见。不需要等待主事务结束
3. 自治事务可以启动其他自治事务
PROCEDURE XXX IS
PRAGMA AUTONOMOUS
XXX
在分布式系统里,可以通过两阶段提交来保证数据的一致性。在多个数据库中,一个数据库做协调者,问其他数据库是否准备好提交,任何一个数据库没有准备好,则全部回退,否则协调者广播,所有数据库提交。
在两阶段提交中,如果遇到系统或者网络问题,在恢复后,recoverer (RECO)进程会协调解决。如果一直没有恢复,则只能由本地administrator手动提交或回退。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/11903161/viewspace-681750/ ,如需转载,请注明出处,否则将追究法律责任。