6.1什么是事务
要么都成功,要么都失败
1.SQL执行 A给B转账 A1000-->200 B200 不能说A的钱扣走了,B没收到钱。
2.SQL执行 B收到A的钱 A800---> B400 所以要么都成功要么都失败 ,不能只发生一个动作(原子性)
将一组SQL放在一个批次中去执行
事务有一个原则:ACID原则: 原子性 一致性 隔离性 持久性
所以要么都成功要么都失败 ,不能只发生一个动作(原子性)
事务前后的数据完整性要保持一致。ab各500他们转钱,无论咋转一起都是1000(一致性)
表示事务结束后的数据不随着外界的原因导致数据的丢失。假如传输断电了,事务没有提交就恢复到原状,事务已经提交,持久化到数据库里。事务一旦提交就不可逆(持久性)
针对多个用户同时操作,主要是排除其他事务对本次事务的影响。两个人同时给A转钱他们互不影响(隔离性)
脏读:指一个事务读读取了另一个事务未提交的数据
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(这不一定是错误,只是某些场合不对)
幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致(一般是行印象,多了一行)
执行事务:
-- 手动处理事务
SET autocommit =0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
INSERT xx
INSERT xx
-- 提交:持久化(成功!)
COMMIT
-- 回滚:回到原来的样子(失败!)
ROLLBACK
-- 事务结束
SET autocommit =1 -- 开启自动提交
-- 了解
SAVEPOINT 保持点名 -- 设置一个事务的保持点
ROLLBACK TO SAVEPOINT 保持点名 -- 回滚到保存点
RELEASE SAVEPOINT 保持点名 -- 撤销保存点
模拟场景
CREATE DATABASE test :代表的是创建数据库 test。
DEFAULT CHARACTER SET utf8 : 代表的是将该库的默认编码格式设置为 utf8 格式。
COLLATE utf8_general_ci : 代表的是数据库校对规则.分为三部分,分别为数据库字符集、解释不明白、区分 大小写。
ci 为 case insensitive 的缩写,即大小写不敏感。utf8_general_cs 区分大小写,
cs 为 case sensitive 的缩写,即大小写敏感。
-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci -- 创建一个数据库
USE shop -- 先运行第一行再第二行
CREATE TABLE account(
id INT(3) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(30) NOT NULL,
money DECIMAL(9,2) NOT NULL,
PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account(`name`,`money`)
VALUES('A',2000.00),('B',1000.00)
-- 模拟转账,转账
SET autocommit =0; -- 关闭自动提交
START TRANSACTION -- 事务开启
UPDATE account SET money=money-500 WHERE `name`='A' -- A减500
UPDATE account SET money=money+500 WHERE `name`='B' -- B加500
COMMIT; -- 提交事务
ROLLBACK; -- 回滚 执行1516,不执行17,执行18恢复到之前,要是提交了,就没法恢复到之前了
SET autocommit = 1; -- 恢复默认值 ,一个一个执行下面的转账操作