(5)共享行级排他锁(SRX锁)
添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。
lock table in share row exclusive mode
上述几种锁模式中,RS锁是限制最少的锁,X锁是限制最多的锁。当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。
下图列出产生锁定模式的SQL语句:
四、事务组成:
一条或者多条DML,[一条DDL]和一条DCL。
五、事务的分类:
1、显式事务:
- 显式的调用DCL。
- 只有用到COMMIT以后才会真正写入数据库,也持久化了。
2、隐式事务:
- 如果人工要使用隐式事务,SET AUTOCOMMIT ON (只针对一个连接)
- 以下情况为自动提交:
1)正常执行完成的DDL语句:create、alter、drop
2)正常执行完场的DCL语句GRANT、REVOKE
3)正常退出的SQLPlus或者SQL Developer等客户端
六、事务控制命令
1、提交事务
在执行使用COMMIT
语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。
2、回滚事务
保存点(savepoint):是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。
设置保存点:
Savepoint a;
删除保存点:
Release Savepoint a;
回滚部分事务:
Rollback To a;
回滚全部事务:
Rollback;
七、示例
银行转帐的例子是最经典的事务示例:
-- 从账户一向账户二转账 DECLARE v_money NUMBER(8, 2); -- 转账金额 v_balance account.balance%TYPE; -- 账户余额 BEGIN v_money := &转账金额; -- 输入转账金额 -- 从账户一减钱 UPDATE account SET balance = balance - v_money WHERE id = &转出账户 RETURNING balance INTO v_balance; IF SQL%notfound THEN raise_application_error(-20001, '没有该账户:' || &转出账户); END IF; IF v_balance < 0 THEN raise_application_error(-20002, '账户余额不足'); END IF; -- 向账户二加钱 UPDATE account SET balance = balance + v_money WHERE id = &转入账户; IF SQL%notfound THEN raise_application_error(-20001, '没有该账户:' || &转入账户); END IF; -- 如果没有异常,则提交事务 COMMIT; dbms_output.put_line('转账成功'); EXCEPTION WHEN OTHERS THEN ROLLBACK; -- 出现异常则回滚事务 dbms_output.put_line('转账失败:'); dbms_output.put_line(sqlerrm); END;
到此这篇关于Oracle事务(transaction)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。