MySql 事务 (6)

要么都成功,要么都失败

将一组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 -- 开启自动提交

 

原文地址:https://www.cnblogs.com/yhc-love-cl/p/13561397.html