事务
概念
事务的概念:(transaction)
- 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
- 当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback) 到最初状态。
四个特性(ACID)
- 原子性(Atomicity)
原子性是指事务是数据库的逻辑工作单元,是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
要么都成功,要么都失败,
- 一致性(Consistency)
事务必须使数据库从一个一致性(相同的)状态变换到另外一个一致性状态。
- 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability)
持久性是指一个事务一旦被提交,就是不可逆的,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
事物的隔离级别
- 脏读:☞一个事务读取了另外一个事务未提交的数据。
- 不可重复读:在一个事务内读取某表的某一行数据,多次读取可能结果不同。
- 幻读:(虚读)是指在一个事务内读取到了另外一个事务插入的数据,导致前后不一致。
事务的执行
set autocommit=0 -- 关闭自动提交
START TRANSACTION; -- 标记一个事务,从这之后的sql都是一个事务
SQL 语句
-- 提交事务
COMMIT;
-- 回滚 :回到原来的样子
ROLLBACK;
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(20) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE INNODB DEFAULT CHARSET utf8;
INSERT INTO `shop`.`account` (`id`, `name`, `money`)
VALUES ( 'A', '1000.00') ('B','10000.00');
SET autocommit=0;
START TRANSACTION;
UPDATE `account` SET money=money-100
WHERE `id`=1;
UPDATE `account` SET money=money+100
WHERE `id`=2;
COMMIT;
ROLLBACK;
SET autocommit=1;