要么都成功,要么都失败
事务的ACID原则 百度 ACID (脏读,幻读)
https://blog.csdn.net/dengjili/article/details/82468576
原子性(Atomicity)
一致性(Consistency)
持久性(Durability) —事务提交
隔离性(Isolation)
在两个都在操作的时候,数据库为每一个用户开启单独的事务,不会被其他事务所干扰。
隔离所导致的一些问题:
脏读:
不可重复读:
在一个事务内读取表中的某一行数据,多次读取的结果不同(不一定是错误的,只是某些场合不对)
虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
-- ============================事务==========================-- 使用set语句来改变自动提交模式SET autocommit = 0; /*关闭*/SET autocommit = 1; /*开启(默认的)*/-- 注意:-- 1.MySQL中默认是自动提交-- 2.使用事务时应先关闭自动提交-- 开始一个事务,标记事务的起始点START TRANSACTION -- 提交一个事务给数据库COMMIT -- 将事务回滚,数据回到本次事务的初始状态ROLLBACK -- 还原MySQL数据库的自动提交SET autocommit =1; -- 保存点SAVEPOINT 保存点名称 -- 设置一个事务保存点ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点RELEASE SAVEPOINT 保存点名称 -- 删除保存点-- 转账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=utf8INSERT 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减500UPDATE account SET money=money+500 WHERE `name` = 'B' -- B加500COMMIT; -- 提交事务ROLLBACK; -- 回滚SET autocommit = 1; -- 恢复默认值
事务的实际使用
