整天说Oracle的事务实际上是指INSERT,UPDATRE,DELETE,SELECT...FOR UPDATE语句,即DML语句

当在应用程序中执行第一条SQL语句时,开始事务;当执行COMMIT或ROLLBACK语句时,结束事务。

1.事务和锁

当执行事务操作(DML语句)时,Oracle会被作用表上加表锁,以防止其他用户改变表结构;同时会在被作用行上加行锁,以防止其他事务在相应行上执行DML操作。

会话A:

UPDATE emp SET sal=sal*2 WHERE ename='Tom';

会话B:

ALTER TABLE emp ADD remark VARCHAR2(100);

ERROR 位于第1行;

ORA-00054:资源正忙,需求指定NOWAIT

为了确保数据库数据的读一致性,不允许其他用户读取脏数据(未提交数据)。

假定会话A将雇员SCOTT工资修改为2000(未提交),那么其他会话将只能查询到原来的工资。只有在会话A提交了实务之后,其他会话才能查询到新工资。

会话A:

UPDATE emp SET sal=2000

WHERE ename='Tom';

会话B:

SELECT sal FROM emp WHERE ename='Tom';

SAL

--------

3000

2.提交事务

使用COMMIT语句可以提交事务。当执行了COMMIT语句之后,会确认事务变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。

会话A:

UPDATE emp SET sal=2000

WHERE ename='Tom';

COMMIT;

会话B:

SELECT sal FROM emp WHERE ename='Tom';

SAL

------

2000

3.回退事务

保存点(savepoint)是事务中的一点,用于取消部分事务。当结束事务时,会自动删除该事务所定义的所有保存点。在执行ROLLBACK命令时,通过指定保存点可以取消部分事务。

☆设置保存点

sacepoint a;

exec dbms_transaction.savepoint('a');

☆取消部分事务

rollback to a;

exec dbms_transaction.rollback_savepoint('a');

☆取消全部事务

rollback;

exec dbms_transaction.rollback;

4.只读事务

不会取得新的数据变化,从而确保取得特定时间点的数据信息。

会话A:

SET TRANSACTION READ ONLY;①

SELECT sal FROM emp WHERE ename='Tom';③

会话B:

UPDATE emp SET sal=1000②

WHERE ename='Tom';

COMMIT;

SAL

------

2000

5.顺序事务

上面的只读事务可以使用用户取得特定时间点的数据信息,当设置了只读事务时,会话将不能执行DML语句,为了使用户可以取得特定时间点的数据,并且允许执行DML操作,可以使用顺序事务。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;