MySQL事务基础,看这篇就够了!


关于MySQL的基础可以看这篇博客: 值得收藏的MySQL基础总结

事务简介

事务(Transaction)

  • 事务是一个最小的不可再分的工作单元。通常一个事务对应一个完整的业务(例如银行账户转账业务)。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务操作

开启事务
start transaction;
提交事务,即将数据写入到磁盘中
commit
回滚事务,回到最初的状态
rollback
查看事务是否开启自动提交
show variables like 'autocommit';
在这里插入图片描述
可以看出在MySQL中事务默认是自动提交的,为了演示事务,首先我们需要关闭自动提交。
关闭事务自动提交
set autocommit=off;
在这里插入图片描述
下面通过一个银行转账的例子进行演示事务,a账户要给b账户转账100元
在这里插入图片描述
下面这两条命令必须同时成功或者同时失败,这就是一个事务

update bank set money=700 where id=1;
update bank set money=600 where id=2;

所以在执行这两句之前需要先开启事务
start transaction;
然后执行事务

update bank set money=700 where id=1;
update bank set money=600 where id=2;

最后提交事务
commit;
这样一波操作成功之后,数据才能被持久化到磁盘,如果仅仅第一条执行成功了,数据只是在内存中保存,而没有持久化到数据库,如果第二条也成功了,那么可以通过commit提交事务保存到磁盘中,如果第二条语句失败了,可以通过rollback回滚到最初的状态,要达到这种目的就需要事务。

事务特征(ACID)

  • 原子性(Atomicity):事务是最小的单位,不可再分
  • 一致性(Consistency):事务要求所有的操作,必须保证同时成功或同时失败
  • 隔离性(Isolation):事务与事务之间互相隔离
  • 持久性(Durability):事务执行成功会,会持久到磁盘中

事务安全隐患

事务和事务之间具有隔离性,隔离性分为四个级别
读未提交(read uncommitted),事务B读取了事务A未提交的数据,也叫做:读脏数据
读已提交(read committed),事务B读取了事务A提交的数据(解决了脏读,这是Oracle的默认隔离级别),也就是说,事务A提交了数据,然后事务B可以读取,提交一次,只能读取一次,这也叫做:不可重复读
可重复读(repeatable read),事务A提交的数据,事务B可以重复读取(解决了脏读和不可重复读,这是MySQL的默认隔离级别),但是,可能出现两次读取的结果不同,这就引起了:幻读
可串行化(serializable),事务A在处理数据的时候,事务B只能排队(解决了脏读、不可重复读和幻读),即是串行化,不能并发,效率很低
在这里插入图片描述
查看事务的隔离界别
select @@transaction_isolation;,可以看出MySQL默认的是可重复读。
在这里插入图片描述
设置隔离级别为读未提交
set session transaction isolation level read uncommitted;
设置隔离界别为读已提交
set session transaction isolation level read committed;
设置隔离级别为可重复读
set session transaction isolation level repeatable read;
设置隔离界别为可串行化
set session transaction isolation level serializable;

发布了468 篇原创文章 · 获赞 327 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/HeZhiYing_/article/details/105378228