理解mysql数据库中的事务与隔离级别

        本文主要阐述mysql数据库中的事务与隔离级别,mysql版本为mysql-5.7.35,点击进行64位版本的下载。 

        想要理解mysql或者其它数据库的事务(Transaction),需要知道事务的定义和为什么需要事务。

1 事务的定义

        百度百科中,对事务的定义为:事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 

        可以简单理解为事务是包含了要做完某个事情的一系列符合规范的SQL语句,就是一个完整的业务逻辑。

2 为什么需要事务?

        SQL中的增、删,改和查往往只能做简单的操作,通常一个业务需要包含多条SQL语句,只有这些SQL语句全部完成了,业务才算成功完成,中间有一条SQL语句失败了,该业务都不能成功,这是业务场景所决定的,比如修改一个人的信息可能涉及到多张表,只有涉及到的所有表全部修改完毕,才算修改成功。在mysql中,只有DML语言才与事务有关,其它语句与事务无关。此处解释下,SQL语言包括四种主要程序设计语言类别的语句:数据定义语言(Data Definition Language, DDL),数据操作语言(Data Manipulation Language),数据控制语言(Data Control Language)和事务控制语言。

3 事务的特性

① 原子性(atomicity)

        事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败。
任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成。

②一致性(consistency)

        事务的一致性是指事务在执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

        一个简单例子,甲给已转账100元,对应数据库的数据必须是甲的账户扣了100元,乙的账户增加了100元。

③隔离性(isolation)

        事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。

④持久性(durability)

        一旦事务提交,那么它对数据库中的对应数据的状态的变更就会永久保存到数据库中。即使发生系统崩溃或机器宕机等故障,只要数据库能够重新启动,那么一定能够将其恢复到事务成功结束的状态。

        上述四个特性,事务的隔离性是最重要的,它具有四种不同的隔离级别,不同的隔离级别有不同的业务场景和执行结果。

4 事务的四大隔离级别

①读未提交(Read Uncommited)

        读未提交指的是事务A和事务B同时执行的过程中,事务A可以可以读取到事务B未提交的数据,该隔离级别最低。可以理解为事务B在执行过程中对表中数据进行了变化,如修改、插入或者删除,但是还未提交,事务A执行过程中,对同一张表进行了查询,此时可以查询到事务B未提交的数据,即可以回滚的数据。

        该隔离级别会造成脏读问题,读到了未提交的数据其实就是脏读,因为修改的数据可能会回滚。实际中,该隔离级别基本不会使用

②读已提交(Read Commited)

        该隔离级别中,事务A只能读取到事务B已经提交的数据,比读未提交的隔离级别高。

        读已提交会有不可重复度的问题,例如,开启事务A后,查询了一次表x,此时开启事务B,事务B在表x中插入了多条数据,并提交了事务,事务A在事务B结束后,又查询了一次表x,此时前后两次读取到表x的数据不一致,即同一个事务执行相同的读取操作,得到不同的结果,这就是不可重复读的问题。

③可重复读(Repeatable Read)

        可重复读就是保证在事务处理过程中,多次读取同一个数据时,其值都和事务开始时刻是一致的,因此该事务级别禁止不可重复读取和脏读取。

        可重复读会带来幻读问题,假设事务A开启后,又有其它事务开启,其它事务修改了表中的数据,但是事务A始终读取到的都是最开始的数据,给人一种一直没有变化的幻想的感觉,所以称为幻读。

④ 串行化

        是最严格的事务隔离级别,它要求所有事务被串行执行,即事务只能一个接一个的进行处理,不能并发执行,该隔离级别下,数据库的效率最低。

        mysql默认的隔离级别是可重复读,使用什么的隔离级别需要根据业务场景需要,比如银行要统计某一个时间段的储蓄金额,但又不能影响用户存钱,也不能影响该时间段的统计结果,采用可重复读是最佳选择。

5 mysql事务相关sql语句

①查看当前隔离级别

//查看当前事物级别:
SELECT @@tx_isolation;

②设置隔离级别

//设置mysql的隔离级别:
set session transaction isolation level 需要设置的事务隔离级别

//设置read uncommitted级别
set session transaction isolation level read uncommitted;

//设置read committed级别:
set session transaction isolation level read committed;

 

//设置repeatable read级别:
set session transaction isolation level repeatable read;

 
//设置serializable级别:
set session transaction isolation level serializable;

③开启事务

begin;//或者 start transcation

//sql语句
commit;//提交或者rollback 回滚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泽箬酱咧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值