要么都成功,要么都失败
将一组sql放在一个批次中去执行
事务 :ACID原则 原子性,一致性,隔离性,持久性 (脏读,幻读...)
原子性(Atomicity,或称不可分割性)
要么都成功,要么都失败
一致性(Consistency)
事务前后的数据完整性要保证一致 1000
隔离性(Isolation)
*与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。*隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。严格的隔离性,对应了事务隔离级别中的Serializable (可串行化),但实际应用中出于性能方面的考虑很少会使用可串行化。
持久性(Durability)
事务一旦提交则不可逆,被持久化到数据库中!
隔离所导致的一些问题
脏读:
指一个事务读取另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(不一定是错误,只是场景不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
-- mysql是默认开启事务自动提交的
SET autocommit = 0 -- 关闭
SET autocommit = 1 -- 开启(默认)
-- 手动处理事务
SET autocommit = 0 -- 关闭
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
INSERT xx
INSERT xx
-- 提交:持久化(成功!)
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 `accont`(
`id` int(11) not null auto_increment commit '学号',
`name` varchar(255) not null commit '名字',
`money` DECIMAL(9,2) not null commit '金钱',
primary key (`id`)
)ENGING=INNODB DEFAULT CHARSET=utf8;
insert into accont (name,money) values ('a',100),('b',100);
-- 模拟转账 事务
SET autocommit = 0 -- 关闭
START TRANSACTION -- 开启一组事务
update accont set money=money-50 where name = 'a'; -- a减50
update accont set money=money+50 where name = 'b'; -- b加50
COMMIT; -- 提交事务,被持久化!
ROLLBACK; -- 回滚,恢复事务
set autocommit = 1 -- 开启自动提交