MySQL数据库-事务

什么是事务?

事务的基本使用

事务管理

开启事务

回滚事务

提交事务

事务执行流程

事务的提交方式

查询数据库中事务的提交方式

修改为手动提交

事务的四大特性(面试题)

原子性(atomicity)

一致性(consistency)

隔离性(isolcation) (复杂)

持久性(durability)

事务的隔离级别(面试题)

四种隔离级别

脏读、不可重复读、幻读

隔离级别的SQL

查询数据库隔离级别

修改数据库隔离级别


什么是事务?

一条或多条 SQL 语句组成一个执行单元,其特点是这个单元要么同时成功要么同时失败。

单元中的每条 SQL 语句都相互依赖,形成一个整体

如果某条 SQL 语句执行失败或者出现错误,那么整个单元就会回滚,撤回到事务最初的状态

如果单元中所有的 SQL 语句都执行成功,则事务就顺利执行。

事务的基本使用

事务管理

开启事务

start transaction;

回滚事务

rollback;

提交事务

commit;

事务执行流程

  1. 开启事务:记录回滚点,并通知服务器,将要执行一组操作,要么同时成功、要么同时失败

  2. 执行sql语句:执行具体的一条或多条sql语句

  3. 结束事务(提交|回滚)

    • 提交:没出现问题,数据进行更新

    • 回滚:出现问题,数据恢复到开启事务时的状态

事务的提交方式

事务的提交方式有两种:自动提交(MySQL默认)手动提交

查询数据库中事务的提交方式

select @@autocommit; 
// 1 代表自动提交
// 0 代表手动提交

修改为手动提交

set @@Aautocommit=0;

事务的四大特性(面试题)

原子性(atomicity)

事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响

一致性(consistency)

事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态

Eg:拿转账来说,假设张三和李四两者的钱加起来一共是2000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是2000,这就是事务的一致性

隔离性(isolcation) (复杂)

当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

持久性(durability)

一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

事务的隔离级别(面试题)

  • 多个客户端操作时 ,各个客户端的事务之间应该是隔离的,相互独立的 , 不受影响的

  • 而如果多个事务操作同一批数据时,则需要设置不同的隔离级别 , 否则就会产生问题 。

四种隔离级别

隔离级别名称出现脏读出现不可重复读出现幻读数据库默认隔离级别
1read uncommitted读未提交
2read committed读已提交Oracle / SQL Server
3repeatable read可重复读MySQL
4serializable 串行化

脏读、不可重复读、幻读

脏读

是指在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两次查询结果不一致。

相当于:不加限制的话,两个事务之间会互相影响。

不可重复读

是指在一个事务处理过程中读取了另一个事务中修改并已提交的数据,导致两次查询结果不一致。

Eg:假设两个事务同时开启,A事务先结束(B未结束)A事务有对数据进行修改,B事务中查询的数据应该要为A事务修改前的数据

幻读

select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入。或不存在执行delete删除,却发现删除成功。

使用serializable,相当于锁表的操作,即只允许一个事务访问该表。

隔离级别的SQL

查询数据库隔离级别

SELECT @@transaction_isolation;
//isolation 分离

注意:从MySQL8.0开始要使用 @@transaction_isolation;在此之前使用 @@tx_isolation

修改数据库隔离级别

-- 标准语法
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

-- 修改数据库隔离级别为read uncommitted (读未提交)
set global transaction isolation level read uncommitted;

解决脏读问题使用的是 read committed(读已提交)

解决不可重复读的问题使用的的是 repeatable read(可重复读)

解决幻读的问题使用的的是 serializable(串行化)

注意:

隔离级别从小到大,安全性越来越高,但是效率越来越低,所以不建议修改数据库默认的隔离级别。

posted @   金鳞踏雨  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-04-13 单例设计模式Singleton Pattern(1)
2021-04-13 史上最全的Java设计模式(更新中...)
点击右上角即可分享
微信分享提示