`
l4432848
  • 浏览: 253406 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC隔离级别

    博客分类:
  • java
阅读更多

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 

JDBC

1、事务的隔离性产生的问题:

1.脏读(dirty read) 一个事务读取了另一个事务尚未提交的数据,

当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下

update account set money=money+100 where name=’B’(此时A通知B)

update account set money=money - 100 where name=’A’ 当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

2.不可重复读(non-repeatable read)当一个事务多次读取时,发现数据有变化

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

3.幻读(phantom read) 一个事务的操作导致另一个事务前后两次查询的结果数据量不同。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

2、事务隔离模式,MYSQL默认的事务隔离级别,repeatable-read,可以防止脏读和不可重复读

image

查看数据库当前的隔离级别:select @@tx_isolation;

修改数据库事务隔离模式为(可以读取未提交的内容):这种模式会导致脏读情况发生,避免这种问题可以修改隔离模式为read-committed只读取提交后的数据;
Set session tx_isolation=’read-uncommitted’;

image

设置为read-committed模式,依然会导致不可重复读的问题发生

image

上图例中可以看出,当A连接提交修改的数据后,导致B连接前后两次查询出的数据不一致。避免这种不可重复读的情况发生,可以将隔离模式设置为repeatable-read(可重复读模式)

image

上图例,将隔离模式设置为可重复读,当A连接修改数据时,对B连接的查询结果没有影响,当A连接提交事务后,对B连接的查询结果也没有影响,只有当B连接也提交事务后,才会查询出最新的数据。但是此种模式依然会导致幻读的发生。
防止幻读的发生可设置为Serializable可串化模式。

总结:

Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

0
0
分享到:
评论

相关推荐

    JDBC事务 JTA事务 传播特性 隔离级别

    - **未提交读(Read Uncommitted)**:最低的隔离级别,允许读取未提交的数据,可能导致脏读、不可重复读和幻读。 - **提交读(Read Committed)**:在提交后才允许读取数据,防止脏读,但可能出现不可重复读和幻...

    JDBC专题(六)-JDBC专题-事务的隔离级别.docx

    ### JDBC专题(六)-JDBC专题-事务的隔离级别 #### 一、事务的基本概念与特性 事务在数据库管理中扮演着极其重要的角色,尤其是在处理关键业务逻辑时,确保数据的一致性和完整性至关重要。根据提供的文件信息,我们...

    spring的隔离级别

    如果没有明确指定,Spring默认使用`DEFAULT`,对应JDBC的默认隔离级别,通常为`READ_COMMITTED`。 5. **事务隔离级别的选择** 隔离级别越高,防止并发问题的能力越强,但同时也可能降低了系统的并发性能。因此,...

    Spring 事务 (二) Spring 声明式事务 配置

    3. **事务隔离级别**:事务的隔离级别决定了并发操作时的数据可见性,Spring支持四种标准的JDBC隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。 4. **事务回滚规则**:默认情况下,...

    【IT十八掌徐培成】Java基础第24天-03.事务并发现象-隔离级别2-表级锁-隔离级别API.zip

    本课程将详细解释这些概念,并通过实例演示如何在Java中实现和管理事务,以及如何利用JDBC设置不同的隔离级别。通过学习这部分内容,开发者将能够更好地理解和处理数据库并发问题,提高应用程序的稳定性和可靠性。

    JDBC事务控制--讲述如何控制JDBC事务

    JDBC 支持四种不同的事务隔离级别,每种级别的隔离效果不同,可以根据具体的应用需求选择合适的级别: 1. **TRANSACTION_NONE**:不支持事务隔离。 2. **TRANSACTION_READ_UNCOMMITTED**:允许读取未提交的数据。 3...

    JBoss jBPM jPDL中文指南

    - **JDBC隔离级别**:控制了事务的一致性和隔离程度。 - **变更jBPM数据库**:如果需要更换数据库,则需要进行相应的调整。 通过以上详尽的介绍,我们可以看出jBPM jPDL是一个功能强大且灵活的工作流引擎。它不仅...

    jdbc2000,jdbc2005

    5. **并发控制(Concurrency Control)**:提供了读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)四种事务隔离级别,增强了数据一致性。...

    【IT十八掌徐培成】Java基础第24天-02.事务并发现象-隔离级别.zip

    JDBC提供了Connection对象的setAutoCommit()方法来开启或关闭自动提交,而Spring则提供了@Transactional注解进行声明式事务管理,可以在方法级别上指定事务属性,如隔离级别。 例如,在Spring中,我们可以这样设置...

    sqljdbc_6.0.zip

    - **事务支持**:支持JDBC的事务隔离级别,如READ UNCOMMITTED、READ COMMITTED等。 - **安全**:提供集成的身份验证和加密功能,确保数据传输的安全。 6. **注意事项** - 驱动版本与JRE版本的匹配至关重要,...

    JDBC事物应用源码文件

    7. **事务隔离级别**:JDBC定义了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。不同的隔离级别影响并发性能和数据一致性。...

    尚硅谷jdbc视频教程

    4. **合理设置事务隔离级别**:根据实际需求调整事务的隔离级别,既能保证数据的一致性,又能提高并发处理能力。 #### 六、常见问题及解决方案 1. **连接超时**:检查网络连接是否正常,同时调整连接超时时间。 2. ...

    JDBC的事务初探

    JDBC支持四种事务隔离级别: 1. **读未提交(READ UNCOMMITTED)**:最低级别,可能读到未提交的数据,可能出现脏读、不可重复读和幻读。 2. **读已提交(READ COMMITTED)**:防止脏读,但可能产生不可重复读。 3....

    sqljdbc41.jar

    2. 提供强大的事务管理能力,支持各种事务隔离级别。 3. 支持Unicode,可以处理多种语言的数据。 4. 支持批处理,提高批量操作的效率。 5. 内置错误处理机制,能够捕获和报告SQLServer相关的异常。 6. 支持SQLServer...

    Spring控制Hibernate中的事务传播特性与隔离级别操作.docx

    让我们深入了解一下这两个类以及它们如何处理事务传播特性和隔离级别。 首先,HibernateTemplate是Spring对Hibernate原生Session的一个包装,它提供了一种更安全、方便的方式来执行常见的Hibernate操作。与直接使用...

    JDBC事务管理.docx

    在JDBC中,可以通过设置Connection对象的事务隔离级别来控制并发行为。例如,使用`setTransactionIsolation()`方法可以设置为`Connection.TRANSACTION_READ_COMMITTED`来实现读已提交的隔离级别,从而避免脏读。同时...

    JDBC事务管理项目

    “JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。

    驱动程序jdbc_4.2

    JDBC支持四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。开发者可以根据应用程序的需求选择合适的隔离级别。 **六、优化与...

    SQL Server JDBC Jar包

    4. **事务支持**:JDBC驱动支持多种事务隔离级别,允许开发者根据应用需求控制事务的并发性和一致性。 5. **Unicode支持**:全面支持Unicode字符集,使得跨语言和地区的数据处理成为可能。 6. **高级查询功能**:...

    sqlserver 2008 jdbc 驱动包

    同时,驱动还支持一些高级特性,如批处理、游标、存储过程调用、事务隔离级别设置等,以满足复杂的应用场景需求。因此,对于那些基于Java平台并需要与SQL Server 2008交互的项目,这个驱动包是不可或缺的工具。

Global site tag (gtag.js) - Google Analytics