【mysql事务】

提示:这篇文章适合复习mysql事务知识的小伙伴翻阅,感谢你们的每一个点赞和评论,你们的支持是我继续发布文章的动力[鲜花][抱拳]


前言

提示:这篇文章是关于mysql事务的基础知识。

mysql事务也是面试中高频的面试题,这篇文章是帮助我们理解一些有关mysql事务晦涩难懂的知识,也是博主自己学习记录的笔记。


一、事务简介

事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系
统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
例如:银行转账业务。张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加
1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。
注:默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务

二、事务操作

1.事务控制

事务控制:指我们可以自己控制事务的提交方式
手动控制事务:1. 修改系统变量值 2. 开启新事务

1.1 事务控制一

通过修改mysql系统的参数来改变事务提交方式:

# 查看/设置事务提交方式
# @@autocommit是系统变量,该变量决定事务是否自动提交
# 1 开启事务自动提交 0 关闭事务自动提交
select @@autocommit; 

#设置事务变量的值为0 关闭事务自动提交
set @@autocommit = 0;

#提交事务
commit;

#回滚事务
rollback;

该方式我们修改了事务的自动提交行为,把默认的自动提交修改为了手动提交,此时我们执行的DML语句都不会提交,需要手动执行commit进行提交。
注:该操作是会话操作,作用范围只针对当前会话窗口有效。

1.2 事务控制二

通过 start transaction 或 begin 来开启一个新事务,自己来控制新事务的提交。该方式是手动控制事务最常用的方式

# 开启事务
start transaction 或 begin

# 提交事务
commit;

#回滚事务
rollback;

转账按例:

数据准备:
drop table if exists account;

create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';

insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

#转账按例:
-- 开启事务
start transaction
-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';

-- 如果正常执行完毕, 则提交事务
commit;

-- 如果执行过程中报错, 则回滚事务
-- rollback;


三、事务四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态(从一种正确状态转换成另一种正确状态)。
  • 隔离性(Isolation):在事务正确提交之前,不允许把该事务对数据的任何改变提交给其他事务。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

上述就是事务的四大特性,简称ACID。

四、并发事务问题

  1. 脏读:一个事务读到另外一个事务还没有提交的数据(B读到A修改但未提交的数据)。
    在这里插入图片描述

  2. 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读(B事务修改数据后提交事务,导致A出现不可重复读)
    在这里插入图片描述

  3. 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了"幻影"。
    在这里插入图片描述

五、事务隔离级别

为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种
在这里插入图片描述
注:mysql默认隔离级别是可重复读,而oracle数据库默认隔离级别是读已提交

1). 查看实物隔离级别

select @@transaction_isolation

2). 设置事务隔离级别

set [session | global] transaction isolation leve {read uncommitted | read committed | repeatable read | serializable}

注: 事务隔离级别越高,数据越安全,但是性能越低

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值