MySQL-事务

MySQL-事务

MySQL-视图&数据库设计原则

概念:事务是一个最小的不可再分的工作单元,通常一个事务就是一个完整的业务
完整业务:下单(像订单表插入一条订单数据insert,在商品表中修改剩余库存update)

一:没有事务存在的问题

DROP TABLE IF EXISTS account

CREATE TABLE account(
 id INT PRIMARY KEY,
 NAME VARCHAR(20),
 balance INT

)

INSERT INTO account VALUES(1,'张三',1000);
INSERT INTO account VALUES(2,'李四',1000);

SELECT * FROM account;

-- 完整业务(转账)张三给李四转500元
UPDATE account SET balance = balance - 500 WHERE NAME = '张三';


UPDATE account SET balance = balance + 500 WHERE NAME1 = '李四';

二:使用事务解决操作原子性

当关闭自动提交功能mysql就可以支持事务
开启事务 start transaction/begin
提交事务 commit
回滚事务 rollback

DROP TABLE IF EXISTS account

CREATE TABLE account(
 id INT PRIMARY KEY,
 NAME VARCHAR(20),
 balance INT
)

INSERT INTO account VALUES(1,'张三',1000);
INSERT INTO account VALUES(2,'李四',1000);

SELECT * FROM account;

-- 完整业务(转账)张三给李四转500元
-- 前提:关闭mysql的自动提交功能
SELECT @@autocommit  -- 1:表示自动提交 0:关闭自动提交
SET autocommit = 0  -- 关闭自动提交

-- 开启事务
START TRANSACTION ;  -- 或者begin 

-- 事务操作
UPDATE account SET balance = balance - 500 WHERE NAME = '张三';

UPDATE account SET balance = balance + 500 WHERE NAME = '李四';


-- 如果事务操作没有问题,可以去提交事务
COMMIT

-- 如果事务操作有问题,可以回滚事务
ROLLBACK

在这里插入图片描述

三:事务的四大基本特征acid

  • 原子性:数据库中原子性强调事务时一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错则会回滚到事务开始前的状态,所有的操作就像没发生一样,不会对数据库有任何影响
    mysql是通过undolog日志实现事务的原子性
    在这里插入图片描述

  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,即一个事务执行之前和执行之后都必须处于一致性状态。一致性是事务管理的最终目标。

  • 持久性(Durability):一个事务一旦被提交commit,则对数据库的所有更新将被永久保存到数据库,不能被回滚

  • 隔离性(Isolation):多个并发事务之间要相互隔离,事务之间不能相互影响,mysql默认设置了事务的隔离

四:事务不隔离存在的问题

  • 1.脏读:事务.B读到事务A没有提交的数据

在这里插入图片描述

  • 2.不可重复读:事务B在同一个事务中,因为事务A修改课数据并提交,造成事务B两次读取到的数据不一致

在这里插入图片描述
在这里插入图片描述

  • 3.幻读:事务B在同一个事务中,因为事务A新增了数据并提交,如果事务B修改数据,会出现多修改了一条数据,出现幻觉
    在这里插入图片描述
    请添加图片描述

五:事务隔离级别

1.每一种隔离级别可以解决特定的错误读问题,当然read uncommitted例外,不能解决三类错误问题
2.隔离级别越高数据越安全,但是效率越低

5.1 读未提交(read uncommitted)

read uncommitted 不能解决三类错误读问题

set session transaction isolation level read uncommitted

5.2 读已提交(read committed)

只能解决脏读,不能解决不可重复度和幻读

set session transaction isolation level read committed

5.3 可重复读(repeatable read)

解决脏读、不可重复读,解决不了幻读

set session transaction isolation level repeatable read

5.4 串行化(serializable)

可以解决所有问题,但是效率太低

set session transaction isolation level serializable

在这里插入图片描述
mysql默认的事务隔离级别是 repeatable read

oracle默认的事务隔离级别是 read committed

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值