Oracle事务

/*
事务的特性(ACID)
  对一组SQL语句操作构成事务,数据库操作系统必须确保这些操作的 原子性,一致性,隔离性,持久性.

1、原子性(Atomicity)
    原子很小 而且不可分割
    事务的原子性是指事务中包含的所有操作要么全做,要么不做,也就是说所有的活动在数据库中要么全部反映,要么全部不反映,
    以保证数据库的一致性。

2、一致性(Consistency)
    数据库前后一致
    事务的一致性是指数据库在事务操作前和事务处理后,其中数据必须满足业务的规则约束。

3、隔离性(Isolation)
    隔离-> 事务在运行中的 隔离
   隔离性是指数据库允许多个并发的事务同时对其中的数据进行读写或修改的能力,隔离性可以防止多个事务的并发执行时,
   由于它们的操作命令交叉执行而导致数据的不一致性。


4、持久性(Durability)
    事务的持久性是指在事务处理结束后,它对数据的修改应该是永久的。即便是系统在遇到故障的情况下也不会丢失,
    这是数据的重要性决定的。

事务指的是逻辑上的一组操作,这组操作要么全部发生,要么全部失败。

举例 : 张三和李四 进行 转账的操作  

张三向转账李四 1000元  张三余额-1000元  李四余额+1000元


时间    张三          李四
t1     1000           0                                    ⚪ 事务开始    事务的起点  同时也是事务的原点
t2     1000-1000      0            回到这个地方来再进行操作                 完整是事务
t3'    0              0+1000       正常操作                 ⚪ 事务结束

t3      -             -  停电了
t4     0              0  来电了

--创建节点给事务取名称
SAVEPOINT  name;
查询张三的钱
从张三中扣除1000
从李四账户中增加1000
COMMIT;
ROLLBACK TO name;



0
100000000 条
100000000->0   删库
0->100000
删库  drop

从删库到跑路 微信小程序

不应该出现的是  在转账过程中由于一些意外,使张三的余额减去了1000元, 而李四并没有收到这笔钱。  
使用事务来进行管理。  必须一起成功或者一起失败

DNF 出bug了  1金币可以打造绝世装备

时间      操作         用户
t1       正常交易      1      ⚪ 完整事务 
{
t1-1     卖出商品      1      ⚪ 事务开始 
t1-2     收到金币      sys    ⚪ 事务结束
}

t2       正常交易      2  <-回到正常时刻  使用事务    ⚪ 完整事务   事务要一层一层的退

t3       卡bug         1                            ⚪ 完整事务 

t4       正常交易      2                             ⚪ 完整事务 
{                                                     {
t4-1     卖出宝珠      2      ⚪ 事务开始              归还宝珠                sys
t4-2     收到金币      sys    ⚪ 事务结束              退还金币(扣除金币)     sys
}                                                     }
     
t5       卡bug         1                             ⚪ 完整事务 
t6       卡bug         1                             ⚪ 完整事务 

SAVEPOINT  按天的事务;
    SAVEPOINT  每个人的小事务1
    SAVEPOINT  每个人的小事务2
    SAVEPOINT  每个人的小事务3
    SAVEPOINT  bug4
    SAVEPOINT  bug5
    SAVEPOINT  bug6
    SAVEPOINT  bug7



买东西

事务名称       事务名称     账户     用户     备注
t1         S1 -1       1000     1         S1 的起点
t2         S2-1        500      2         S2 的起点
t3         S2-2        500-100  2         取钱

t4         s1-2        1000+100000000  1  通过计算机技术偷钱
t5         s2-3        400      2         查询
t6         s1-3        1000000~100 1      查询



时间       事务名称     账户     用户     备注
t1         S1 -1       1000     1         S1 的起点           ⚪ 事务开始
t4         s1-2        1000+100000000  1  通过计算机技术偷钱
t6         s1-3        1000000~100 1      查询                ⚪ 事务结束

t2         S2-1        500      2         S2 的起点            ⚪ 事务开始
t3         S2-2        500-100  2         取钱
t5         s2-3        400      2         查询                 ⚪ 事务结束  


XSS
网站是由前端 后端组成
jd        前端页面  mac电脑 20000   下单购买
jd        后端页面  计算价格  转跳到收银台
收银台       XSS  2w->0.01                 确认收到钱(并不回传收到多少钱)转跳回jd
jd     校验 确认自己收到钱了
jd        确认收款  发货


事务
事 事情  对数据库可以做的事情(操作)  对表的操作 更删改查  创建修改删除表结构  创建视图创建~~~ 
务 任务  你做了是否完成

回来想一想  你们之前玩游戏 游戏的回档操作是如何进行的??
1 任务的角色名称 
2 个人的仓库
3 个人的等级
4 背包
5 金币

也就意味这 回档可能只是针对某一个表的数据回档不是针对全部




*/


--隐式的事务
--事务的提交
COMMIT;

-- 自动保存 数据库本身就是隐式的在做事务操作
--怎么开启显示的事务
SET AUTOCOMMIT  off  --开启事务
SET AUTOCOMMIT  on  --默认自动事务



insert into student values ('s011','测试数据1',23,'男');
insert into student values ('s012','测试数据2',23,'男');
--开启后无论做任何更删改查都需要做提交才会被执行
COMMIT;


insert into student values ('s0133','测试数据4',25,'男');
insert into student values ('s014','测试数据5',20,'女');


--显示的事务

--创建节点给事务取名称
SAVEPOINT  name;
/*
SAVEPOINT  节点的关键字
save       节点的名称

--执行的事务过程



*/
--事务的提交
COMMIT;
/*只有提交后的数据才能到数据表中*/
ROLLBACK TO name;
/*
注意这个退回只能在提交前使用
ROLLBACK 返回节点
TO       指定节点
name;    节点名称

*/



SAVEPOINT  S11;
insert into student values ('s911','测试数据1',23,'男');
insert into student values ('s912','测试数据2',23,'男');
COMMIT;

SAVEPOINT  S12;
insert into student values ('s913','测试数据3',25,'男');
insert into student values ('s914','测试数据4',20,'女');
COMMIT;


SAVEPOINT  S13;
insert into student values ('s915','测试数据5',25,'男');
insert into student values ('s916','测试数据6',20,'女');
ROLLBACK TO S13;
COMMIT;

--我要回到某个节点当如何
ROLLBACK TO S12;




SAVEPOINT  S11;
insert into student values ('s911','测试数据1',23,'男');
insert into student values ('s912','测试数据2',23,'男');

SAVEPOINT  S12;
insert into student values ('s913','测试数据3',25,'男');
insert into student values ('s914','测试数据4',20,'女');


SAVEPOINT  S13;
delete from student where sname='测试数据1';
delete from student where sname='测试数据2';
insert into student values ('s915','测试数据5',25,'男');
insert into student values ('s916','测试数据6',20,'女');
ROLLBACK TO S12;
COMMIT;
delete
posted @ 2020-06-17 17:10  忘山川  阅读(142)  评论(0编辑  收藏  举报