TCL 事务控制语言

TCL 事务控制 语句
什么是事务:用于确保数据的一致性,由一组相关的DML组成, 该组DML的操作要么全确认,要么全取消
比如银行转账业务 步骤一:从A账户减少300元,步骤二:向B账户增加300元.
为了确保总的金额不变 就要维持数据的一致性 步骤一和步骤二两个操作或者全确认 或者全取消
事务的开始语句:update insert delete  select ... for update 都能触发一个事务的开启
事务的结束语句:commit提交 rollback回滚
未完成的事务可以撤销
未完成的事务,其他会话看不到结果,只能看到提交的结果
维护事务需要锁和回退段参与

事物控制语句
COMMIT
SAVEPOINT
ROLLBACK

事务的提交方法
1.手动提交
执行commit语句
2.自动提交
ddl,dcl会自动提交之前未结束的事务
 exit 退出sqlplus会自动提交
3. 设置sqlplus里: set autocommit on|off
事务的撤销方法
1.手动撤销
执行rollback
2.自动撤销
网络或数据库崩溃
强制退出sqlplus 点击X按钮

commit  执行就是提交整个事务
rollback 用savepoint设置定点 可以回退到事务过程中的定点位置

SCOTT@ora10g> select * from t1 where id=3;

ID NAME       HIREDATE       DEPTNO     SAL
---------- ---------- ------------------- ---------- ----------
 3 shrek      2010-12-31 08:51:19   30     600

SCOTT@ora10g> update t1 set sal=sal+10 where id=3;

1 row updated.

SCOTT@ora10g> savepoint u10;

Savepoint created.

SCOTT@ora10g> update t1 set sal=sal+10 where id=3;

1 row updated.

SCOTT@ora10g> savepoint u20;

Savepoint created.

SCOTT@ora10g> update t1 set sal=sal+10 where id=3;

1 row updated.

SCOTT@ora10g> savepoint u30;

Savepoint created.

SCOTT@ora10g> rollback to savepoint u10;

Rollback complete.

SCOTT@ora10g> select * from t1 where id=3;

ID NAME       HIREDATE       DEPTNO     SAL
---------- ---------- ------------------- ---------- ----------
 3 shrek      2010-12-31 08:51:19   30     610

SCOTT@ora10g> rollback;

Rollback complete.

SCOTT@ora10g> select * from t1 where id=3;

ID NAME       HIREDATE       DEPTNO     SAL
---------- ---------- ------------------- ---------- ----------
 3 shrek      2010-12-31 08:51:19   30     600

SCOTT@ora10g> 



什么是读一致性
SCN (system changed number)数据库内部时间戳
数据库每做一件事都会有SCN号跟随 进行定位
场景描述:
SCOTT原工资3000
A_session在SCN 1000时间改了SCOTT的工资 4000 但是没有提交
B_session在SCN 1001时间查看SCOTT的工资 此时应该看到的是3000还是4000?
看到3000还是4000取决于数据库的事务隔离级
ORACLE数据库默认采用的是:查看提交后的数据(查询已提交)
所以上面场景中B查到的是3000

场景描述:
1.A_session发起查询 SCN 1000 查询数据很大 时间很长
2.在上步查询未完成时:
B_session要修改数据 SCN 10001,
为了能确保修改能够被回滚,把SCN 1000的数据(改前镜像)复制到回滚段,之后修改数据并提交
3.A_session查询才运行到去查看B_session刚修改的数据
  此时A_session需要的数据状态为SCN 1000时的,而数据却被B_session改成了SCN 10001状态
  A必须要找到SCN 1000状态的数据,为了获取到SCN 1000时候的数据,A去回滚段中查找到数据.
这就是读一致性
确保读到数据是select发起时SCN点数据状态
即一个语句所处理的数据集是在单一时间点上的数据集,这个时间点是这个语句开始的时间
一个语句看不见在它开始执行后提交的修改。


那么这3000从哪里获得? 回滚段
回滚段中什么时候添加的数据? B_session更改前
回滚段中的数据叫什么? 改前影像

你可能感兴趣的:(oracle)