我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务
事务——就是完成同一个业务的多个DML操作
例:
原子性(A):一个事务中的多个DML操作,要么同时执行成功,要么同时失败
一致性(C):事务执行之前和事务执行之后,数据库中的数据是一致的,完整性和一致性不能被破坏
隔离性:数据库允许多个事务同时执行,多个并发的事物之间不能发生影响
持久性:事务完成之后,对数据库的操作是永久的
在Mysql中,默认DML指令执行自动提交,当我们执行一个DML语句后,自动同步到数据库中
用sql语句执行后,先短暂进入一个缓存区域,检查语句是否正确,然后再对数据空间进行改变
开启事务,就是关闭自动提交,在缓存区域进行检查,如果检查正确,则可以正确提交,对数据空间进行修改

2.1 开启事务:start transaction
2.2 依次执行事务中的每个操作
2.3 如果在执行的过程中的任何位置出现异常,则执行rollback回滚事务,将缓存区域保存的语句直接删除
2.4 如果食物中所有的DML操作都执行成功,则在最后执行commit提交事务,在数据库中进行数据改变
create databases 数据库名;
create database db_test3;

use 数据库名;
use db_test3;

create table 表名(字段名...);
- create table stock(
- id int primary key auto_increment,
- name varchar(20),
- num int not null
- );

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
- );

- insert into stock(name,num)
- values(
- '鼠标',10
- );
-
- insert into stock(name,num)
- values(
- '键盘',20
- );
-
- insert into stock(name,num)
- values(
- '耳机',30
- );

- #扣减库存
- #{
- update stock set num=num-1 where name='键盘';
- #如果不加入事务进行回滚则会执行前半部分语句,后半部分语句错误则不会通过
-
- select aaa;
-
- #订单加1
- insert into order_db(name,price,num) values('键盘',50,1);



start transaction;
start transaction;

开启事务后的运行结果


开启事务后,如果不成功则两段都不会运行
rollback 事务回滚:消除缓存中的操作,撤销当前事务已经执行的操作

commit 手动提交

1.读未提交 2.读已提交 3.可重复读 4.单行化
隔离级别依次递增

读未提交:一个事务中读到了另一个事务中修改了但未提交的数据,会造成数据的差别,产生了不一致性

读已提交:避免了脏读但是会导致虚读,在多次查询之间修改了数据,导致多次查询的结果不同
3.可重复读 repeatable read可重复读:在第一次操作完全结束之前,不能被其他事务影响,避免了不可重复读,但可能会造成幻读,在查询时,第二次修改后查询出的结果和第一个事务又往前递增,就会查询出修改前修改后的两个数据,会出现所谓的幻读

串行化:同时只允许一个事务对数据进行操作,避免了脏读、虚读、幻读


select @@transaction_isolation;
select @@transaction_isolation;


set session transaction isolation level 事务隔离级别 ;
set session transaction isolation level read committed ;



越往后等级越高,之后的是为了解决前一级别遇到的问题