Mysql事务原理与优化

本文详细阐述了Mysql事务的背景、ACID特性、并发事务可能遇到的问题、隔离级别、事务问题定位方法以及优化策略,包括事务的设置和如何避免死锁等问题。
摘要由CSDN通过智能技术生成

Mysql事务原理与优化

Mysql事务背景

在并发场景下,多个事务对同一批数据进行增删查改,可能会导致脏读,脏写,幻读,不可重复读的问题.
为了解决这些问题,Mysql引入 事务隔离机制,锁机制,MVCC多版本并发控制隔离机制,日志机制.用于解决多事务并发问题.

Mysql事务 和 ACID属性

事务是一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性。此处的事务与并发场景中的事务概念不相同。

事务ACID特性:
A:atomicity(原子性) :针对操作层面.事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全都不执行;
C:consistent(一致性)针对数据层面.在事务开始和完成是,数据都必须保持一致状态.
	也就是说所有相关的数据规则都必须应用于事务的修改,以保持输的完整性;
I:isolation(隔离性)数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行.
	这意味着事务处理过程中的中间状态对外部是不可见的; 不同事务之间相互独立,互不影响.
D:durable(持久性)事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持.

并发事务会出现的问题

①更新丢失(Lost Update)或脏写:
当两个或多个事务选择同一行数据修改,有可能发生更新丢失问题,即最后的更新覆盖
了由其他事务所做的更新。
如,两个事务同时操作一条数据,初始值都是10,一个事务将数据修改成5,另一个事务将数据修改成4.当两个事务都提交之后,最后提交的事务会将前面事务的操作结果覆盖。

②脏读(Dirty Reads)
事务A读取到了事务B已经修改但尚未提交的数据。如,两个事务对同一个数据进行操作,事务A 先将数据从10修改成5,还未提交事务,但此时事务B 读取了数据5,将5修改成2,并提交事务.而此时事务A 出现异常将数据进行回滚.那么这个时候事务B 进行的操作就属于脏读.(不考虑事务隔离级别)

③不可重读(Non-Repeatable Reads)
事务A内部的相同查询语句在不同时刻读出的结果不一致。一个事务在执行过程中,查询同一条数据,在不同时刻的结果不相同,不符合隔离性.(目前要求的隔离级别是能达到可重复读)。

④幻读(Phantom Reads)
事务A读取到了事务B提交的新增数据。
如,事务A 读取到事务B提交的新增数据,不符合隔离性; 如,事务A 查询 id<=5的数据,有2条,然后事务B 提交了一条新数据,后事务A 再进行查询发现结果变成3。

事务的隔离级别

隔离级别脏读(DirtyRead)不可重复读(Non-Repeatable Reads)幻读(Phantom Reads)
读未提交(Read Uncommitted)可能可能可能
读已提交(Read Committed,简称 RC)不可能可能可能
可重复读(RepeatableRead,简称 RR)不可能不可能可能
可串行化(Serializable)不可能不可能不可能
Mysql设置隔离级别方法

1.读未提交
set tx_isolation = ‘read-uncommitted’;
2.读已提交
set tx_isolation = ‘read-committed’;
3.可重复读
set tx_isolation = ‘repeatable-read’;
4.串行化
set tx_isolation=‘serializable’;
注意: Mysql默认的事务隔离级别是 可重复读(RR) 使用Spring进行开发时,如果不设置Spring的事务隔离级别,会使用Mysql设置的隔离级别,如果Spring设置,就使用Spring的隔离级别。

事务问题定位

Mysql查看事务
select * from INFORMATION_SCHEMA.INNODB_TRX;
查看锁
select * from INFORMATION_SCHEMA.INNODB_LOCKS;
查看锁等待
select * from INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
释放锁
trx_mysql_thread_id可以从INNODB_TRX表里查看到
kill trx_mysql_thread_id
查看锁等待详细信息
show engine innodb status\G;

mysql会自动检测到一些简单的死锁,并回滚产生死锁的事务.但是对于复杂的死锁业务,mysql无法自动检测;

Mysql大事务的影响

1.并发情况下,数据库连接池容易被撑爆;
2.锁定太多的数据,会造成大量的阻塞和锁超时;
3.执行时间长,容易造成主从延迟;
4.回滚所需要的时间较长;
5.undo log 膨胀;
6.容易导致死锁;

事务优化方式

1.将查询等数据准备操作放到事务外;
2.事务中避免远程调用,远程调用要设置超时,防止事务等待太长时间;
3.事务中便面一次性处理太多数据,可以拆分成多个事务分次处理;
4.更新等设计加锁的操作尽可能放在失误靠后的位置;
5.能异步处理的尽量异步处理;
6.业务代码逻辑保证数据一致性,非事务执行;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值