事务
一、概念:
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 开启事务:
start transaction;
- 设置回滚点:
savepoint rollbackpointname
- 回滚:
rollback (to rollbackpointname);
- 提交:
commit;
事务提交后 事务的操作持久化 回滚点消失
查看事务的默认提交方式:select @@autocommit;
----1
代表自动提交 0
代表手动提交
修改默认提交方式: set @@autocommit = 0;
事务提交的两种方式:
①自动提交: mysql就是自动提交的 ; 一条DML(增删改)语句会自动提交一次事务。
②手动提交: Oracle 数据库默认是手动提交事务 ; 需要先开启事务,再提交
二、事务的四大特征(ACID)
- 原子性A:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性C:当事务提交或回滚后,数据库会持久化的保存数据。
- 隔离性I:多个事务之间。相互独立。
- 一致性D:事务操作前后,状态不变。
三、事务隔离级别
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 不可重复读(虚读) :在同一个事务中,两次读取到的数据不一样。
- 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修 改。
隔离级别:
- read uncommitted:读未提交
产生的问题:脏读、不可重复读、幻读 - read committed:读已提交 (Oracle)
产生的问题:不可重复读、幻读 - repeatable read:可重复读 (MySQL默认)
产生的问题:幻读 - serializable:串行化
可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低
数据库查询隔离级别: select @@transaction_isolation;
数据库设置隔离级别:
set session transaction isolation level
级别字符串;
set global transaction isolation level
级别字符串;
存储过程
存储过程,带有逻辑的sql语句,之前的sql没有条件判断,没有循环,存储过程带上流程控制语句(if while)。
特点:
1)执行效率非常快!存储过程是在数据库的服务器端执行的。
2)移植性很差!不同数据库的存储过程是不能移植。
创建存储过程
delimiter $ -- 声明存储过程的结束符$
create procedure pro_test()
begin
sql语句
end$
-- 执行存储过程
call pro_test();
触发器
当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成。(由动作1发生引起动作2执行)。一种特殊的存储过程
,能够完成特定的功能、存储再数据库服务器上的SQL片段
。无需调用
,自动的。主要用于日志记录
,数据校验等。现在触发器只支持行级触发
,不支持语句级触发。
- 什么条件触发(事件):I、D、U
- 什么时候触发:增删改前或后
- 触发频率:针对每一行执行
- 触发器定义表上或附着表上
触发器四大要素
监视地点、监视事件、触发时间、触发事件
# 创建触发器
create trigger 触发名 before|after 触发事件
on 表名 for each row
# 只有一条执行语句 不需要begin、end
begin
执行语句;
end
# 查看触发器
show triggers
# 删除触发器
drop trigger if exists 触发器名
NEW、OLD
触发了触发器的那行数据,来引用触发器中发生变化的记录内容。
# insert只有new
create trigger trigger_test after insert
on user for each row
insert into user_logs values(NULL, now(), concat('有用户添加,信息为:'