数据库事务

本文介绍了MySQL事务的基本概念,强调了只有Innodb引擎支持事务,并详细阐述了事务的ACID特性。接着,文章讨论了事务的四个隔离级别:读未提交、读已提交、可重复读和串行化,及其对并发问题的影响,包括脏读、不可重复读和幻读等。最后,提到了事务隔离级别的设置和不同级别对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务概述

MySQL事务机制主要用于处理操作量大、复杂度高的数据
在MySQL中只有使用了Innodb数据库引擎的数据表和数据库才支持事务
事务处理可以用来维护数据的完整性,保证多条SQL语句要么全部执行,要么全部不执行
事务用于管理insert、update和delete之类的DML语句,[select语句],其它类型的SQL语句没有事
务的概念

事务必须满足ACID4个条件:A原子性、C一致性、I隔离性、D持久性
原子性:一个事务中的所有操作要么全部完成、要不一个都不做,不会结束在中间某个环节
一致性:事务执行结束后数据库的完整性没有破坏
隔离性:数据库允许多个并发事务对数据库中的数据进行读写操作,隔离性可以防止多个事务并发
执行时导致的数据不一致性。事务根据隔离等级可以分为4级:读未提交、读已提交、可重复读和
串行化
持久性:事务执行完成后对数据的修改就是永久的

隔离级别

数据库重要的功能就是实现数据共享,对于同时运行的多个事务,当多个事务同时访问数据库中相同的数据时,如果没有采取必要的隔离机制,则会导致出现各种并发问题。

问题的本质就是共享数据的线程安全问题

常见问题

1、第一类丢失更新:A事务回滚时把已经提交的B事务更新的数据覆盖了。

2、脏读:A事务读取到B事务更新但是还没有提供的数据,如果B回滚撤销,则A读取的数据就是临时而且无效的数据。

3、不可重复读:A事务读取到了一个字段值,但是B更新并提交了该字段的修改,A再次读取同一个字段值,但是两次读取到的内容不一致。

4、幻读:A事务从一个表中读取了多行数据,但是B事务插入或者删除了一些新的行,如果A再次读取,则发现数据会有多出来或者少掉的行。

5、第二类丢失更新:A事务修改记录,同时B事务修改记录,B提交数据后使用B的修改结果覆盖了事务A的修改结果

事务隔离性

数据库系统必须具有隔离并发各个事务的能力,使其相互不会影响,避免各种并发问题。一个事务和其它事务隔离的程度就成为隔离等级。数据库中规定了多种事务隔离级别。不同的隔离级别对应不同的干扰程度,隔离级别越到,数据的一致性就越号,但是并发性越差

隔离级别的范围

隔离级别的作用范围可以分为全局级和会话级两种。全局级对所有的会话有效,会话级只对当前会话有效

设置全局隔离级别:

set global transaction isolation level read committed;

设置会话级隔离级别:

set session transaction isolation level read uncommitted;

隔离级别:

隔离级别描述
Read-Uncommitted允许事务读取其它事务没有提交的数据,脏读、不可重复读和幻读问题都会出现
Read-Committed
只允许事务读取其它事务已经提交的数据,可以避免脏读,但是不可重复读和幻读问题都会出现
Repeatable-Read可以保证多次从一个字段中读取相同的数据,可以认为事务开启时会自动对现有数据进行快照,其它事务修改不管是否提交,当前事务读取的时快照数据,可以避免脏读和不可重复读,但是幻读问题会出现。快照是MVCC多版本并发控制
Serializable可以确保事务是串行执行,可以避免所有的并发问题,但是由于性能低下,一般不使用

读未提交:

MySQL数据库中事务的隔离实际上是依靠锁机制来实现的,但是加锁会带来性能的损失。读未提交隔离等级是不加锁的,所以性能最好,但是由于基本没有什么限制,所以脏读问题都无法解决。

读已提交:

解决脏读问题的方法就是只允许读取别的事务已经提交的数据,其它事务未提交数据当前事务不能读取。例如oracle默认的事务隔离级别就是读已提交。由于只能读取已经提交的数据,所以可能出现两次读取的数据不一致.

可重复读:

针对不可重复读的问题提出了可重复读的隔离等级,针对查询采用了MVCC多版本并发控制引入快照机制,每个事务都有自己的数据快照,即使其它事务提交数据,也不影响当前事务相关行的数据快照。幻读仍旧会出现。

序列化:

隔离等级最高,隔离效果最好,可以解决脏读、不可重复度和幻读问题,当时并发性最差。将事务的并发执行转换为顺序执行,后一个事务的执行必须等待前一个事务结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值