首页 > 编程知识 正文

MySQL事务隔离级别,数据库隔离级别怎么实现的

时间:2023-05-04 13:50:31 阅读:47186 作者:3939

欢迎原创博文、转载。 转载时请务必附上博文链接。 谢谢您的尊重。

前言通过本篇,您可以了解【Spring事务】和【数据库事务】之间的关系以及优先级问题。 一个个地讨论下去。

读了本篇,你可能需要的博文:

@Transactional注释参数详细信息和注释使用特征说明(经典版本) transactional注释的失效场景。 这个问题我见过太多人栽了跟头,为了让面试官能默默地处理数据库事务、事务隔离级别,以及脏读、不可重复读、幻读, 我认真的正文数据库可以控制事务Spring进一步封装在上面,可以通过不同的项目、不同的操作再次控制事务的传播行为和隔离级别。

这意味着spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,因此spring事务本质上使用数据库锁,而spring事务

上面的“总结”来自网络,结合自己的理解和实践,确实最能发出精华。 本文的内容主要围绕这句话展开,以两个问题的形式阐明观点。

Spring定义的隔离级别与数据库设置的隔离级别是什么关系? 如果在Spring中定义的隔离级别与在数据库中设定的隔离级别不同,会以谁为基准? 一、两者关系的详细情况在我其他博文中有具体介绍(需要的朋友见正文【前言】提示),这里不做说明,直接比较结果。

1. 数据库的隔离级别:MySQL的默认值为EPEATABLE_READ; Oracle,sql server的默认值为READ_COMMITTED; READ_UNCOMMITTED的隔离级别较低,因此通常不使用。

: (未出现:隔离级别隔离级别值的脏读不可重复读取未提交读取0 ) () (读取未提交)已提交读取) Spring事务通过@Transactional注释实现,隔离级别由其参数isolation控制。 isolation eum类定义了表示隔离级别的“5个”值,如下所示:

:(: ) Isolation值和隔离级别隔离级别值可能不会出现脏读isolation.http://www.Sina.com/0---- isolation.http://www . 1isolation.http://www.Sina.com/2isolation.http://www.Sina.com/4isolation.3358 www.Sina

另外,与JDBC隔离级别相对应的四个隔离级别与Java重写相同。 因此,Spring事务隔离级别进一步封装在数据库隔离级别之上。

二、既然不匹配是如何封装的,那么Spring项目应该以Spring事务为准,除非使用@ transactional (isolation=isolation.default )

为了验证这一预期,让我们找到并解密源代码,然后从JDBC开始。

1.JDBC加载过程的所有Spring事务管理都涉及与数据库的交互,也必然涉及JDBC连接。

你还记得JDBC加载的流程吧。 你一定被问到了。 包括注册驱动程序、建立连接、发出请求和输出结果四个步骤。 写伪代码:

连接连接=null; 语句stmt=null; ResultSet rs=null; 注册try{//1.JDBC驱动程序class.forname (com.MySQL.JDBC.driver ); //2 .链接System.out.println ('连接数据库.'); conn=驱动程序管理器. getconnection (JDBC : MySQL ://localhost 33603306/my _ db )、“根”、“根”//3.db String sql='SELECT id,name,url FROM websites '; RS=STMT.executequery(SQL; //4 .输出结果System.out.print ('查询结果: ' rs ); //关闭资源()演示代码

,不要纠结没有写在finally中) rs.close(); stmt.close(); conn.close(); } catch (SQLException se) se.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }

在创建连接阶段,JDBC 从数据库获取一个连接 Connection 对象,该对象不仅有连接数据库的方法,还有设置当前连接的事物隔离级别的方法。

2. Connection  源码解释

Connection 实体类中包含了 void setTransactionIsolation(int level) throws SQLException;设置设置当前连接的事物隔离级别的方法。

Spring 约定了使用 @Transactional 注解的形式实现事务特性,而隔离级别的开启,也是注解的形式实现,如:开启事务的串行级别 —— @Transactional(isolation = Isolation.SERIALIZABLE)。

源码截不全,我复制一下:

/*** 这是 Connection 连接的部分源码*/public interface Connection extends Wrapper, AutoCloseable { ... /** * 尝试将此连接对象的事务隔离级别更改为给定的级别 * 接口连接中定义的常量是可能的事务隔离级别 */ void setTransactionIsolation(int level) throws SQLException; ...}

该方法的注释说明:尝试将此连接对象的事务隔离级别更改为给定的级别,如果在事务期间调用此方法,则结果由实现定义。

没错,强调的就是本次连接 Connection,所以,如果spring与数据库事务隔离级别不一致时,以spring为准。

3. 验证

阐述一下方法:

首先,验证测试数据库的隔离级别 Select @@tx_isolation;写一个包含update,save的与测试数据库交互的方法;分别验证加上@Transactional(isolation = Isolation.SERIALIZABLE)注解前后,测试数据库的隔离级别是否变化!!

以我的测试数据库为例,结果没有发生变化,都是 READ_COMMITTED。

这只是简单的验证下Spring事务隔离级别的修改,是否会直接影响数据库的隔离级别,结论是没有。

不太严谨,但是证明了我的猜想,后期我会在Sping项目中,通过测试代码进一步验证“修改隔离级别以成功运用到Spring事务中”。

三、总结 数据库是可以控制事务的传播和隔离级别的,Spring在之上又进一步进行了封装,可以在不同的项目、不同的操作中再次对事务的传播行为和隔离级别进行策略控制;项目中,以 Spring 事务为准,因为他重写了数据库的隔离级别,但没有直接修改数据库的隔离级别;项目中,如果 Spring 事务隔离级别设置为(isolation = Isolation.DEFAULT)默认数据库优先时,以数据库的隔离级别为准。

小编怀着忐忑的心情,上传了本篇博文,如果有错误,还请大佬指正!!后期也会补全自己的验证手段!!

That's all,thank you!

我是IT无知君,您的点赞、评论和关注,是我创作的动力源泉。
学无止境,气有thdby,让我们一起加油,天涯未远,江湖有缘再见!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。