1.事务就是不成功便成仁的节奏
简单来说事务是由一系列要不都成功要不都失败的操作组成的,举个简单例子:小明进行转账处理
可以预见的是系统处理步骤是:
1.修改小明的账户余额:减少100;
2.修改对方的账户余额:增加100;
这时候如果在处理步骤2时,系统异常了,没有正常增加100,那么对么小明账户的操作也应该是无效的.
2.没有事务的世界
1.创建一个账户表:
create table T_ACCOUNT ( code VARCHAR2(100) not null, balance NUMBER, owner VARCHAR2(100) )
2.创建两个账号:
insert into t_account(code,balance,owner) values ('001',100,'小明'); insert into t_account(code,balance,owner) values ('002',100,'小张');现在 我们有两个账号了,
update t_account t set t.balance = t.balance -100 where t.owner='小明'; commit; update t_account t set t.balance = t.balance +100 where t.owner='小张 '; commit;将小明的账号减100,小张的账号加100
看下对不对
select t.* from t_account t
结果如下:
擦!小明的账号是减少了100,可小张的还是100,好吧,这里设了个小坑,故意把小张的名字后加了一个空格,这样的话肯定就不会对小张的账户进行更新了,但是由于进行了commit,所以小明的账户余额被莫名其妙地减少了100
3.与事务的初级见面
在SQL里输入以下代码:
declare vCount number; begin select count(*) into vCount from t_account t where t.code='小明'; if vCount = 0 then raise no_data_found; end if; update t_account t set t.balance = t.balance -100 where t.owner='小明'; select count(*) into vCount from t_account t where t.code='小张 '; if vCount = 0 then raise no_data_found; end if; update t_account t set t.balance = t.balance +100 where t.owner='小张 '; commit; exception when no_data_found then dbms_output.put_line('找不到对应账户'); rollback; end;运行后查看结果,发现账户余额一切正常,但报错信息如期而至.
这里的关键词commit和rollback,如果一切正常最后程序进行了commit,如果没有找到账户,则会进行rollback,rollback的效果就是小明和小张的账户余额都是"回滚"到处理之前的状态;
4.原来事务管理就是commit和rollback的组合啊
如果你面对的数据是存放在数据库中的,那么事务对你来说就是各种commit和rollback的组合.
5.事务的特性ACID
ACID:
A是Atomicity的简写,原子性,是数据库能够进行操作的最小的逻辑单元,证明他包含的所有操作都是不可分割的。
C是Consistency的简写,一致性,就是他们要么同时全部成功,要么同时全部失败。成功与失败的操作保持一致
I是Isolation的简写,隔离性,指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到;
D是Durability的简写,持久性,当系统或介质发生故障时,确保已提交事务的更新不能丢失;