一、数据库事务
数据库事务介绍——要么全部成功要么全部失败
我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务
事务——就是完成同一个业务的多个DML操作
例:
数据库事务四大特性
原子性(A):一个事务中的多个DML操作,要么同时执行成功,要么同时失败
一致性(C):事务执行之前和事务执行之后,数据库中的数据是一致的,完整性和一致性不能被破坏
隔离性:数据库允许多个事务同时执行,多个并发的事物之间不能发生影响
持久性:事务完成之后,对数据库的操作是永久的
二、MySQL事务管理(应用)
1.自动提交
在Mysql中,默认DML指令执行自动提交,当我们执行一个DML语句后,自动同步到数据库中
用sql语句执行后,先短暂进入一个缓存区域,检查语句是否正确,然后再对数据空间进行改变
2.事务管理
开启事务,就是关闭自动提交,在缓存区域进行检查,如果检查正确,则可以正确提交,对数据空间进行修改
2.1 开启事务:start transaction
2.2 依次执行事务中的每个操作
2.3 如果在执行的过程中的任何位置出现异常,则执行rollback回滚事务,将缓存区域保存的语句直接删除
2.4 如果食物中所有的DML操作都执行成功,则在最后执行commit提交事务,在数据库中进行数据改变
3.案例
1.创建数据库
create databases 数据库名;
create database db_test3;
2.使用数据库
use 数据库名;
use db_test3;
3.创建库存表
create table 表名(字段名...);
create table stock( id int primary key auto_increment, name varchar(20), num int not null );
4.创建订单表
create table 表名(字段名...);
create table order_db( id int primary key auto_increment, name varchar(200) not null, price double, num int );
5.给库存表中添加数据
insert into 表名(字段名) values (字段对应的数据);
insert into stock(name,num) values( '鼠标',10 );
5.创建订单表
insert into 表名(字段名) values (字段对应的数据);
create table order_db( id int primary key auto_increment, name varchar(200) not null, price double, num int );
5.给库存表中添加数据
insert into stock(name,num) values( '鼠标',10 ); insert into stock(name,num) values( '键盘',20 ); insert into stock(name,num) values( '耳机',30 );
6.如果不加入事务进行回滚则会执行前半部分语句,后半部分语句错误则不会通过
#扣减库存 #{ update stock set num=num-1 where name='键盘'; #如果不加入事务进行回滚则会执行前半部分语句,后半部分语句错误则不会通过 select aaa; #订单加1 insert into order_db(name,price,num) values('键盘',50,1);
7.开启事务 将自动提交改为手动提交
start transaction;
start transaction;
开启事务后的运行结果
开启事务后,如果不成功则两段都不会运行
rollback 事务回滚:消除缓存中的操作,撤销当前事务已经执行的操作
commit 手动提交
三、四种事务隔离级别
1.读未提交 2.读已提交 3.可重复读 4.单行化
隔离级别依次递增
1.读未提交 read uncommited
读未提交:一个事务中读到了另一个事务中修改了但未提交的数据,会造成数据的差别,产生了不一致性
2.读已提交 read commited
读已提交:避免了脏读但是会导致虚读,在多次查询之间修改了数据,导致多次查询的结果不同
3.可重复读 repeatable read
可重复读:在第一次操作完全结束之前,不能被其他事务影响,避免了不可重复读,但可能会造成幻读,在查询时,第二次修改后查询出的结果和第一个事务又往前递增,就会查询出修改前修改后的两个数据,会出现所谓的幻读
4.单行化 serializable
串行化:同时只允许一个事务对数据进行操作,避免了脏读、虚读、幻读
5.设置数据库事务隔离级别
6.查看数据库默认的隔离级别
select @@transaction_isolation;
select @@transaction_isolation;
7.设置数据库隔离级别
set session transaction isolation level 事务隔离级别 ;
set session transaction isolation level read committed ;
越往后等级越高,之后的是为了解决前一级别遇到的问题