数据库的事务处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dingchenxixi/article/details/72877682

对于数据表的操作,很明显查询是比更新操作更安全,因为更新操作有可能会出现错误,以导致没有按照既定的要求正确完成操作

但是在很多时候,更新有可能会有多条指令共同完成,例如:银行转账
从A转5000到B的账户:
1.判断A的账户是否有5000
2.判断B账户是否存在且状态是否正常
3.从A账户中扣除5000
4.向B账户中增加5000
5.扣除相应的手续费

以上的5个操作是一个整体,可以理解为一个完整的业务,如果这之中第三点出错了,那么其它操作呢?所有的操作都应该不再执行,并且回归到最原始的状态,而这一操作流程就是事务的操作
所有的事务操作都是针对每一个session进行的,在oracle数据库之中,把每一个连接到数据库上的用户都称为一个session,每一个session之间都彼此独立,不会含有任何的通讯,而每一个session独享自己的事务控制,而事务控制之中主要使用两个命令:

1. 事务的回滚:ROLLBACK,更新操作回到原点
2. 事务的提交:COMMIT,真正的发出更新的操作,一旦提交之后无法回滚
但是这样也会出现问题,例如:某一个session在更新后并没有进行提交事务,这时候其它session是无法进行更新的,必须等待之前的session提交后才可以更新完成

下面示范:
打开两个session ,用户都为scott

user_A:UPDATE myemp SET job='worker' WHERE empno=7369;

user_B:UPDATE myemp SET job='singer' WHERE empno=7369;


我们可以发现当user_A进行更新操作时,user_B并不能同时进行更新操作,只有当user_A的更新操作进行COMMIT后,user_B才能够更新:

而此时,雇员编号为’7369’的雇员,job到底是worker还是singer呢?

我们可以清楚地看到,当user_B未commit时,user_A查询到的结果还是worker,并未更新成singer

当我们将user_B的更新操作进行commit之后,user_A查询的结果:

ROLLBACK原理也是一样,当你进行操作后,只要还没有commit就可以ROLLBACK进行事务回滚

但是,如果未提交之前进行回滚,那么操作就会撤销:

猜你喜欢

转载自blog.csdn.net/dingchenxixi/article/details/72877682