【从删库到跑路】一文带你明白MySQL数据库的 事务 操作

专栏【MySQL】
喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
音乐分享【如愿】
大一同学小吉,欢迎并且感谢大家指出我的问题

文章目录

  • 事务
    • ⭐简介
    • ⭐普通操作——不使用事务
    • 第一种事务操作
      • ️‍查看/设置事务的提交方式
      • ️‍提交事务
      • ️‍回滚事务
    • 自动提交VS手动提交
    • ⭐事务操作
      • 设置为手动提交
      • 重新建立一张表并且添加数据
      • 进行事务操作
      • ✨报错了,怎么办
    • 第二种事务操作
      • ️‍开启事务
      • ️‍提交事务
      • ️‍回滚事务
    • ⭐事务操作
      • 首先进行 开启事务
      • 重新建立一张表并且添加数据
  • 事务的四大特性
    • ⭐原子性
    • ⭐一致性
    • ⭐隔离性
    • ⭐持久性
  • 事务隔离级别
    • ⭐查看事务隔离级别
    • ⭐设置事务隔离级别
  • 事物并发问题
    • ⭐脏读
    • ⭐不可重复读
    • ⭐幻读
  • 总结

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第1张图片

建议大家先看目录

事务

⭐简介

是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
保证数据的完整性,一致性

⭐普通操作——不使用事务

首先创建一张表并且插入数据

create table account1(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
)comment '账户表';

insert into account1(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第2张图片
转账操作,张三给李四转账1000
查询张三账户余额

select * from account1 where name='张三';

将张三账户余额 -1000

update account1 set money=money - 1000 where name='张三';

将李四账户余额 +1000

update account1 set money=money + 1000 where name='李四';

结果
操作成功
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第3张图片

第一种事务操作

️‍查看/设置事务的提交方式

select @@autocommit;
set @@autocommit=0;

️‍提交事务

commit

️‍回滚事务

rollback;

自动提交VS手动提交

默认为1,是自动提交,如果要变为手动提交,
可以设置set @@autocommit=0

如果我们不用事务的话,是默认自动提交,写入命令后,直接写入数据库
但是如果使用事务的话,要调整为手动提交,写入命令后,要执行commit;,才能把数据传入数据库

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第4张图片
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第5张图片

⭐事务操作

设置为手动提交

set @@autocommit = 0;

重新建立一张表并且添加数据

-- 重新建立一张表并且添加数据
create table account2(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
)comment '账户表';

insert into account2(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);

结果
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第6张图片

进行事务操作

-- 转账操作(张三给李四转账1000)
-- 1.查询张三账户余额
select * from account2 where name='张三';
-- 2.将张三账户余额-1000
update account2 set money=money - 1000 where name='张三';
-- 3.将李四账户余额+1000
update account2 set money=money + 1000 where name='李四';

-- 提交事务
commit ;

结果

在执行事务的时候,最后一定要使用commit提交事务

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第7张图片

✨报错了,怎么办

如果在执行过程中程序报错了,不要commit提交事务,要使用rollback回滚事务,这样子可以保证数据库中的数据不变
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第8张图片
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第9张图片

第二种事务操作

️‍开启事务

start transaction;begin;

️‍提交事务

commit;

️‍回滚事务

rollback;

⭐事务操作

首先进行 开启事务

start transaction ;

重新建立一张表并且添加数据

-- 重新建立一张表并且添加数据
create table account3(
    id int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
)comment '账户表';

insert into account3(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);

结果
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第10张图片

如果所有的事务都执行成功,那么就提交事务,否则回滚事务

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第11张图片

在回滚事务之前,只要没有commit提交事务,那么数据库表中的数据不会发送变化

事务的四大特性

⭐原子性

事务是不可分割的最小操作单元,要么全部成功,要么全部失败

⭐一致性

事务完成时,必须使所有的数据都保持在一致的状态

⭐隔离性

数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

⭐持久性

事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

事务隔离级别

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第12张图片

⭐查看事务隔离级别

select @@transaction_isolation;

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第13张图片

⭐设置事务隔离级别

set (session或者global) transaction isolation level 隔离级别;

隔离级别是read uncommittedread committedrepeatable readserializable

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第14张图片

事物并发问题

多个并发事务在执行当中所出现的问题

⭐脏读

A事务 读取到 B事务未提交的数据
称为 脏读
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第15张图片

修改事务隔离级别
就没有脏读的问题了

【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第16张图片

⭐不可重复读

一个事务先后读取同一条记录,但是两次读取的数据不同,称为不可重复读
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第17张图片
修改事务隔离级别
就没有不可重复读的问题了
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第18张图片

⭐幻读

一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,有发现这行数据已经存在,就好像出现了“幻觉”
【从删库到跑路】一文带你明白MySQL数据库的 事务 操作_第19张图片

总结

事务隔离级别越高数据越安全,但是性能越低
我们在设置事务的隔离级别时,要权衡事务的安全性和性能
一般我们就使用默认的隔离级别

如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正

你可能感兴趣的:(MySQL,数据库,mysql)