mysql事务

发布于:2024-06-19 ⋅ 阅读:(75) ⋅ 点赞:(0)

事务简介

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%不会互相影响)

事务主要有这么几种隔离强度,强度以此增强

  1. 并发的事务之间没有任何隔离性(读未提交)
  2. 并发的事务之间有一定的隔离性,未提交的不能读,但是已提交的可以(读已提交)
  3. 并发的事务之间有有次强的隔离性,已经提交的不能读(可重复读)
  4. 禁止事物并发,不同事务以单线程方式串行执行(序列化)

读未提交可以解决的并发问题,无法解决的并发问题

可以解决的:无
无法解决的:脏读,不可重复读,幻读

读已提交可以解决的并发问题,无法解决的并发问题

可以解决的:脏读
无法解决的:不可重复读,幻读

可重复读可以解决的并发问题,无法解决的并发问题

可以解决的:脏读,不可重复读
无法解决的:幻读

序列化可以解决的并发问题,无法解决的并发问题

可以解决的:脏读,不可重复读,幻读
无法解决的:无

四种隔离级别的安全性和效率排名

安全:序列化> 可重复读> 读已提交 > 读未提交
效率: 序列化< 可重复读 <读已提交 < 读未提交