8.14事务

事务
事务:一个逻辑中需要一系列的数据库操作,这些操作称之为一个事物。
例如:转账涉及到两个操作。
小明 给 小红 转账400

第一个操作 update accxm set 余额=原来的值-400
第二个操作 update accxh set 余额=原来的值+400

这两个操作都必须成功,或者都失败:不能存在第一个操作成功了,第二个操作失败。
这种情况,就可以把这两个操作称之为事物

本来是两个独立的操作,人为的把他们捆绑到一块,就是一个事务

事务有四个特性: 面试必问

  1. 原子性 不可再分
    要么全做,要么不全做
    事务会保证 如果第一个操作成功,第二个操作失败,第一个操作就会自动回滚。
  2. 一致性
    转帐前:小明的余额 5000 小红的余额 5000
    转账后:两个余额相加,总金额是不变的
  3. 隔离性
    两个线程同时操作一张表,一个线程对表的改变,如果没有事务提交,另一个线程是看不到的。
  4. 持久性
    一旦操作成功,此过程是不可逆的

子程序
1.存储过程
2.函数

子程序相当于java中的方法,是一段代码,需要被调用才可以执行

存储过程
–方法一:简单添加
create or replace procedure add_employee(
eno number, --输入参数,雇员编号
name varchar2,–输入参数,雇员名称
salary number,–输入参数,雇员薪水
job VARCHAR2 DEFAULT ‘CLERK’,–输入参数,雇员工种默认’CLERK’
dno number --输入参数,雇员部门编号
)
IS
begin
insert into emp (empno,ename,sal,job,deptno)values (eno,name,salary,job,dno);
end;
public void add_employee(int eno, String name, int salary , String job, int dno)

调用存储过程
EXEC add_employee(1111,‘MARY’,2000,‘MANAGER’,10);

如果成功,emp中会多一条记录

2.函数
create or replace function get_sal(eno number) return number
is
v_sal emp.sal%type; --声明变量
begin
select sal into v_sal from emp where empno=eno; --把查询结果放到 v_sal
return v_sal; --返回变量
exception --异常
when no_data_found then --如果没有找到对应的值
raise_application_error(-20012,‘该雇员不存在’); --输出字符串
end;

–调用查询薪水函数
declare
v_sal number;
emp_20012 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20012, -20012);
begin
v_sal:=get_sal(7780); --调用函数
dbms_output.put_line(v_sal);–输出结果
exception
when emp_20012 then
v_sal:=0;
dbms_output.put_line(‘该雇员不存在’);
end;

问题:直接写sql不就可以了,为什么要有存储过程?
如果遇到很复杂的逻辑,程序员搞不定,那么dba就可以写存储过程,然后被程序员调用就可以了,存储效率较高。

java调用存储过程:call{}

触发器:
跟存储过程和函数调用方式不一样
存储过程和函数需要显式调用,而触发器只需要满足指定的条件,就会自动执行
–创建触发器
CREATE OR REPLACE TRIGGER tr_del_emp
BEFORE DELETE --指定触发时机为删除操作前触发
ON emp --此触发器只对那个表有效
FOR EACH ROW --说明创建的是行级触发器
WHEN (old.deptno <> 10) --触发限制:deptno的新值不等于40,触发器就会执行
BEGIN
–将修改前数据插入到日志记录表 del_emp ,以供监督使用。
INSERT INTO del_emp(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate );
END;

序列

nextval currval

1.创建序列
create sequence acc_id
2.使用
select acc_id.nextval from dual
insert into acount values (acc_id.nextval,‘tom’,1000)
注:一般用于自动生成id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值