事务
6.1、什么是事务
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
事务原则:(ACID原则) 原子性、一致性、隔离性、持久性
原子性(Atomicity)
要么都成功,要么都失败。
比如说:1、SQL执行 A给B转账200 A 1000 -->200 B 200
2、SQL执行 B收到A的钱 A 800 B 400
1和2的操作要么都成功,要么都失败。
一致性(Consistency)
事务前后的数据完整性要保证一致。
(也就是说上面例子中A和B的总钱数1200不管怎么转账它都保持不变)
持久性(Durability)
事务一旦提交则不可逆,被持久化到数据库中!
隔离性(Isolation)
事物的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个事务之间要相互隔离。
隔离所导致的一些问题
脏读
指一个事务读取了另一个事务未提交的数据
不可重复读
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定错误,只是某些场合不好)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
执行事务
-- mysql是默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 --开启(默认)
-- 模拟过程
-- 手动处理事务
SET autocommit = 0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
-- 具体操作······
-- 提交: 持久化
COMMIT
-- 回滚: 回到原来的样子
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
SAVEPOINT 保存点名 --设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点
模拟场景
-- A在线买一款价格为500元商品,网上银行转账.
-- A的银行卡余额为2000,然后给商家B支付500.
-- 商家B一开始的银行卡余额为10000
-- 创建数据库和表并添加数据
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',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
ROLLBACK; -- 回滚
COMMIT; -- 提交事务,就被持久化了!
SET autocommit = 1; -- 恢复默认值
本文作者:Li-An
本文链接:https://www.cnblogs.com/Li-An/p/16444364.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。