事务
什么是事务
要么都成功,要么都失败
- SQL 执行,A给B转账 A 800 —->200 B 200
- SQL执行,B收到A的钱,A600 B400
将一组SQL放在一个批次中去执行
事务原则:ACID原则:原子性,一致性,隔离性,持久性
以上面的例子 A 给 B 转账200
A少了200,B多了200
原子性(Atomicity ):这两个步骤一起成功或者一起失败。
无论两人互相之间如何转,两个人最终的和是1000,不会变。
一致性(Consistency):最终一致性,事务前后的数据完整性要保持一致。
操作前 A:800,B:200 操作后 A:600,B:400 如果在操作前(事务还没提交)服务器宕机或者断电,那么重启数据库之后,数据状态为 A:800,B:200 如果在操作之后(事务已经提交)服务器宕机或者断电,那么重启数据库之后,数据状态为 A:600,B:400
持久性(Durability):事务没有提交,恢复到原状,事务已经提交,持久化到数据库。事务一旦提交就不可逆,持久化到数据库中。
A给B赚钱,B给C转钱,互相之间不会影响。 针对多个用户同时操作,主要是排除其它事务对本次事务的影响
隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其它事务的操作数据所干扰,事务之间要相互隔离。
事务的隔离导致的问题
脏读
指一个事务读取到了另一个事务未提交的数据。
不可重复读
在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务的数据,导致前后读取不一致(一般是行影响,多了一行)
执行事务
mysql是默认开启事务自动提交的
-- mysql是默认开启事务自动提交的
SET autocommit = 0 /*关闭*/
SET autocommit = 1 /*开启(默认的)*/
-- 手动处理事务
SET autocommit = 0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在一个事务内
-- 提交:持久化(成功)
COMMIT
-- 回滚:回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 释放保存点
模拟场景
-- 转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
USE shop;
SHOW TABLES;
-- DECIMAL(P,D);
-- P是表示有效数字数的精度。 P范围为1〜65。
-- D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
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',10000.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 -- 回滚
SET autocommit = 1; -- 恢复默认值
本作品采用《CC 协议》,转载必须注明作者和本文链接