最新--事务的学习!

一、什么是事务

(72条消息) 什么是事务?事务的基本操作、事务的隔离性问题、事务的ACID特性_zhao_miao的博客-CSDN博客_什么是事务

  • 事务:逻辑上的一组操作(将一组SQL放在一个批次中去执行 ),组成这组操作的各个单元,要么全部成功,要么全部失败.
  • InnoDB支持

二、事务的特性:ACID

  • 原子性:事务不可分割;两个步骤要么一起成功,也么一起失败,不能只发生其中的一个动作

  • 一致性:事务执行前后数据完整性保持一致;即:针对一个事务操作前和操作后的状态一致

  • 隔离性:一个事务的执行不应该受到其他事物的影响。针对多个用户同时并发操作数据库,数据库为每一个用户开启事务,不能被其他事务的操作数据所干扰。

  • 持久性:一旦事务结束,数据就持久化到数据库。事务结束后的数据不随着外界原因导致数据丢失

三、不考虑事物会引发的安全问题(隔离性没做好产生的问题)

  • 读问题
    • 脏读:一个事务读到另一个事务未提交的数据
    • 不可重复度:一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致.
    • 幻读:一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致
  • 写问题
    • 丢失更新

 四、SQL模拟

1.原理

-- 事物:假设存在两条正在执行的sql,这两条sql要么都成功,要么都失败
/*
事物原则:ACID原则
原子性:这两个步骤一起成功或一起失败,不能出现一个成功一个失败
一致性:最终一致性,事务操作前后数据完整性一致
持久性:事务结束后不会出现数据的丢失。事物没有提交,恢复到原状;已经提交,就会持久化数据库,不可逆
隔离性:多个用户同时操作,数据库为每一个用户开启事务,不能被其他事务的操作数据所干扰。
*/

/*
隔离性可能出现的问题:
脏读:一个事物读取了另一个事物未提交的数据
不可重复度:在一个事物内读取表中的某一行数据,多次读取的结果不同
幻读:一个事务内读取到了别的事物插入的数据
*/

INSERT INTO `account` (`name`,`money`) VALUES ('A',2000),('B',1000)
-- mysql 默认开启事务自动提交

-- 手动处理事务
-- 1.关闭自动提交
SET autocommit = 0  -- 关闭

-- 2. 事务开启
START TRANSACTION  -- 标记一个事务的开始,这个之后的sql都在一个事务内(sQL都成功,或都失败)

UPDATE `account` SET `money` = `money` - 500 WHERE `name` = 'A'
UPDATE `account` SET `money` = `money` + 500 WHERE `name` = 'B'


-- 3.
-- 执行成功,COMMIT 提交:持久化
COMMIT
-- 执行失败,ROLLBACK 回滚:回到原来的状态
ROLLBACK
-- 事务结束
SET autocommit = 1  -- 开启自动提交

-- 补充
SAVEPOINT 保存点  -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点

2.模拟场景

一行行执行,不要一次性全选执行!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值