事务简介
MYSQL事务只针对更新语句生效(update,insert,delete)
事务是是数据库提供的一个特性,是代表单个工作单元的一组SQL语句,组成事务的所有语句都应该运行成功,否则事务会执行失败。
工作单元指的是完成一项工作的最小组成单位,比如银行取款100块钱是一项工作,包括登录,选择取款金额,输入密码,拿走钱等流程,其中的任何一个流程失败就会导致最后的取款失败。
事务回滚
事务具有回滚特性。
假如一个工作单元包含m个步骤
其中第n个步骤执行的时候失败了,前(n-1)个步骤都成功了,我们应该退回到第(n-1)个步骤或者还原前(n-1)个步骤的变动
事务的特性
ACID性
1. A——Atomicity,原子性
强调的是事务的不可分割的特性
原子性对应的英文是Atomicity,即表示事务中所有操作是不可再分割的原子单位。事务中所有操作要么全
部执行成功,要么全部执行失败;
2. C——Consistency,一致性
强调的是事务执行前后数据需要保证一致
一致性对应的英文是Consistency,事务执行后,数据库状态与其它业务规则保持一致。例如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的;
3. I——Isolation,隔离性
强调的是多个事务同时操作一条记录,事务之间不能互相干扰
隔离性对应的英文是Isolation,是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰;
4.D——Durability, 永久性
强调的是事务一旦结束了,数据将永久的保存到数据库中
持久性对应的英文是Durability,指的是一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据(mysql的binlog进行日志回滚)
隔离性最重要,因为隔离性保证了多线程并发下,事务之间不会互相干扰
MYSQL事务的使用
mysql的事务是默认自动提交的
1. 使用start TRANSACTION + commit/rollback语句(不需要修改数据库的自动提交选项)
start TRANSACTION;
update t_account set money = money - 1000 where username = "冠希";
update t_account set money = money - 1000 where username = "美美";
-- rollback;
-- rollback一定要在commit之前执行,否则就回滚不回去了(事务特性——永久性)
commit;
2. 关闭数据库自动提交,手动commit/rollback
show variables like '%commit%';
我们可以发现是on的状态,所以将他关闭
-- 这两个都行
set autocommit = off;-- on开启
set autocommit = 0;-- 1开启
后面就和第一种方式一样了,第二种方式其实就是少写一个start TRANSACTION;
start TRANSACTION;
update t_account set money = money - 1000 where username = "冠希";
update t_account set money = money - 1000 where username = "美美";
-- rollback;
-- rollback一定要在commit之前执行,否则就回滚不回去了(事务特性——永久性)
commit;
事务隔离性的强度(事务隔离级别)
事务的隔离性是针对并发的事务之间的,因为不并发的事务执行相互独立,不会互相影响,也就不需要隔离(账户余额100,A先从账户当中取100,完毕之后B再去账户取钱,发现余额为0,这相当于单线程串行操作,100%不会互相影响)
事务主要有这么几种隔离强度,强度以此增强
- 并发的事务之间没有任何隔离性(读未提交)
- 并发的事务之间有一定的隔离性,未提交的不能读,但是已提交的可以(读已提交)
- 并发的事务之间有有次强的隔离性,已经提交的不能读(可重复读)
- 禁止事物并发,不同事务以单线程方式串行执行(序列化)
读未提交可以解决的并发问题,无法解决的并发问题
可以解决的:无
无法解决的:脏读,不可重复读,幻读
读已提交可以解决的并发问题,无法解决的并发问题
可以解决的:脏读
无法解决的:不可重复读,幻读
可重复读可以解决的并发问题,无法解决的并发问题
可以解决的:脏读,不可重复读
无法解决的:幻读
序列化可以解决的并发问题,无法解决的并发问题
可以解决的:脏读,不可重复读,幻读
无法解决的:无
四种隔离级别的安全性和效率排名
安全:序列化> 可重复读> 读已提交 > 读未提交
效率: 序列化< 可重复读 <读已提交 < 读未提交