一、什么是事务
(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.模拟场景
一行行执行,不要一次性全选执行!