Oracle事务的ACID特性
原子性Atomicity:事务中的所有动作要么都发生,要么都不发生。 |
一致性Consistency:事务将数据库从一种状态转变为下一种一致状态。 |
隔离性Isolation:一个事务的影响在该事务提交前对其他事务时不可见的。 |
持久性Durability:事务一旦提交,其影响就是永久性的。 |
事务控制语句
事务隐式开始
事务必须显示结束(Commit、Rollback)
Commit 会结束事务,并使得已做的修改持久的保存在数据库中 |
Rollback 会结束事务,并撤销这个事务所做的修改。撤销动作需要读取回滚段中的信息,并把数据恢复到事务开始之前的状态 |
Savepoint 创建标记点(marked point),一个事务可以有多个标记点 |
Rollback To<Savepoint> 把事务回滚到指定的标记点,但是不回滚此标记点之前的工作。 |
Set transaction 允许设置不同的事务属性,如事务的隔离级别以及事务时只读的还是可读可写的。 |
原子性
语句级原子性 SQL> create table t2(cnt int); Table created. SQL> insert into t2 values(0); 1 row created. SQL> create table t(x int check(x>0)); Table created. SQL> create or replace trigger t_trigger CNT SQL> select * from t; no rows selected SQL> insert into t values(1); 1 row created. SQL> insert into t values(-1); SQL> select * from t2; CNT |
过程级原子性 Oracle把PL/SQL匿名块也当做是语句 SQL> create or replace procedure p Procedure created. SQL> delete from t; 0 rows deleted. SQL> update t2 set cnt=0; 1 row updated. SQL> commit; Commit complete. SQL> select * from t; no rows selected SQL> select * from t2; CNT SQL> begin SQL> set serveroutput on SQL> select * from t; no rows selected SQL> select * from t2; CNT |
事务级原子性 |
DDL与原子性 |
持久性
COMMIT的WRITE扩展 COMMIT WRITE WAIT (默认)必须等待redo写到磁盘才返回消息给客户端 COMMIT WRITE NOWAIT 异步提交,redo条目还没写入磁盘就返回消息给客户端 |
非分布式PL/SQL代码块中的COMMIT 在后台以异步的方式执行 即commit=commit write nowait |
完整性约束和事务
Immediate约束 整个SQL语句得到处理后立即检查 SQL> create table t(x int unique); Table created. SQL> insert into t values(1); 1 row created. SQL> insert into t values(2); 1 row created. SQL> commit; Commit complete. SQL> update t set x=x-1; 2 rows updated. |
Deferrable约束和级联更新 SQL> create table parent Table created. SQL> create table child Table created. SQL> insert into parent values(1); 1 row created. SQL> insert into child values(1); 1 row created. SQL> update parent set pk=2; 由于约束是IMMEDIATE模式,update失败,换为deferred模式 Constraint set. SQL> update parent set pk=2; 1 row updated. SQL> set constraint child_fk_parent immediate; SQL> update child set fk=2; 1 row updated. SQL> set constraint child_fk_parent immediate; Constraint set. SQL> commit; Commit complete. |
不好的事务习惯
在循环中提交 1.性能影响
2.Snapshot Too Old |
|||
使用自动提交 |
分布式事务
自治事务:允许创建一个事务中的事务,它能独立于其父事务提交或者回滚。