服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - MySQL事务及Spring隔离级别实现原理详解

MySQL事务及Spring隔离级别实现原理详解

2021-01-18 14:30玄同太子 Mysql

这篇文章主要介绍了MySQL事务及Spring隔离级别实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、事务具有acid特性

  • 原子性(atomicity):一个事务被事务不可分割的最小工作单元,要么全部提交,要么全部失败回滚。
  • 一致性(consistency):数据库总是从一致性状态到另一个一致性状态,它只包含成功事务提交的结果
  • 隔离型(isolation):事务所做的修改在最终提交一起,对其他事务是不可见的
  • 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。

2、事务的隔离级别

1)隔离级别的定义与问题

  • read uncommitted(读未提交):事务的修改,即使没有提交,对其他事务也都是可见的。事务能够读取未提交的数据,这种情况称为脏读。
  • read committed(读已提交):事务读取已提交的数据,大多数数据库的默认隔离级别。当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。
  • pepeatable read(可重复读):这个级别是mysql的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的记录是一致的,但这个级别还是会出现幻读的情况。幻读是指当一个事务a读取某一个范围的数据时,另一个事务b在这个范围插入行,a事务再次读取这个范围的数据时,会产生幻行。特别说明:innodb和xtradb存储引擎通过多版本并发控制(mvcc,multiversion concurrency control)解决了幻读问题,它使用间隙锁(next-key locking)锁定查询涉及的行和索引中的间隙,防止幻影行的插入。
  • serializable(可串行化):这个事务是最高的隔离级别,它强制事务串行执行,避免了幻读问题。简单来说,serializable会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁竞争

 

隔离级别 脏读可能性 不可重复度可能性 幻读可能性 加锁读
read unconmited yes yes yes no
red commited no yes yes no
repeatable read no no yes no
serializable no no no yes

 

2)如果查看修改和mysql的隔离级别

?
1
2
3
4
show variables like 'tx_isolation';  # 查看隔离级别,mysql8以前
show variables like 'transaction_isolation'; # 查看隔离级别,mysql8
 
set global transaction_isolation='read-committed'; // 设置隔离级别,阀域read-uncommittedread-committedrepeatable-readserializable

事务的隔离级别可以是session层的,我们可以对不同的session设置不同级别:

?
1
2
3
4
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;

3)spring事务隔离级别

spring事务默认使用数据库的隔离级别,可以通过注解@transactional中的isolation参数调整session级的隔离级别。隔离级别是会话级别的,jdbc的java.sql.connection接口支持隔离级别的设置。

MySQL事务及Spring隔离级别实现原理详解

spring在开启事务时(datasourcetransactionmanager.dobegin),根据注解配置,对connection的隔离级别进行设置:

MySQL事务及Spring隔离级别实现原理详解

mysql驱动com.mysql.cj.jdbc.connectionimpl执行sql语句调整会话级的隔离级别

MySQL事务及Spring隔离级别实现原理详解

3、死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。死锁示例:

?
1
2
3
4
5
6
7
8
9
10
11
# 事务一
start transaction;
update account set money=10 where id=1;
update account set money=20 where id=2;
commit;
 
# 事务二
start transaction;
update account set money=10 where id=2;
update account set money=20 where id=1;
commit;

假设碰巧,事务一和事务二同时执行完第一个update语句,接着准备执行第二条update语句,却发现记录已被对方锁定,然后2个事务都等待对方释放资源,同时持有对方需要的锁,这样就会出现死循环。

为了避免死锁问题,数据库实现了各种死锁检测和死锁超长机制,innodb处理死锁的方式是:将持有最少行级排他锁的事务进行回滚。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/zhi-leaf/p/12807249.html

延伸 · 阅读

精彩推荐
  • MysqlMySQL中的唯一性约束与NULL详解

    MySQL中的唯一性约束与NULL详解

    这里记录的是很久之前的一个 bug 了,主要给大家介绍了关于MySQL中唯一性约束与NULL的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,...

    Giraffe2352020-07-28
  • MysqlMySQL 5.5.49 大内存优化配置文件优化详解

    MySQL 5.5.49 大内存优化配置文件优化详解

    最近mysql服务器升级到了MySQL 5.5.49版本,性能比mysql 5.0.**肯定效率高了不少,但mysql的默认配置文件不合理,这里是针对大内存访问量大的机器的配置方案,...

    陈明乾5312020-06-09
  • MysqlMac下mysql 5.7.17 安装配置方法图文教程

    Mac下mysql 5.7.17 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.17 源码编译安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    湖工电气2812020-07-12
  • MysqlLinux下安装mysql-5.6.4 的图文教程

    Linux下安装mysql-5.6.4 的图文教程

    在开始安装前,先说明一下mysql-5.6.4与较低的版本在安装上的区别,从mysql-5.5起,mysql源码安装开始使用cmake了,因此当我们配置安装目录./configure --perfix=...

    MYSQL教程网3512020-01-03
  • MysqlMySQL批量插入和唯一索引问题的解决方法

    MySQL批量插入和唯一索引问题的解决方法

    这篇文章主要给大家介绍了关于MySQL批量插入和唯一索引问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习...

    linuxidc4512020-09-18
  • MysqlUbuntu上mysql的安装及使用(通用版)

    Ubuntu上mysql的安装及使用(通用版)

    今天小编就为大家分享一篇关于Ubuntu上mysql的安装及使用(通用版),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    baiduoWang4862019-06-03
  • MysqlMySQL定期分析检查与优化表的方法小结

    MySQL定期分析检查与优化表的方法小结

    听DBA的人说,相比oracle,MySQL就是一个玩具级别的数据库,在网易门户中,DBA基本很少去管理到MySQL的东西,所以我们产品使用到的MySQL的一些配置和优化还...

    MYSQL教程网3522020-04-07
  • Mysqlmysql索引使用技巧及注意事项

    mysql索引使用技巧及注意事项

    本篇文章主要介绍了mysql索引使用技巧及注意事项,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    夏雪冬日4812020-07-22