HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    读脏数据和不可重复读(读脏数据和不可重复读解决)

    发布时间:2023-04-14 01:29:24     稿源: 创意岭    阅读: 78        

    大家好!今天让创意岭的小编来大家介绍下关于读脏数据和不可重复读的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008

    本文目录:

    读脏数据和不可重复读(读脏数据和不可重复读解决)

    一、数据库:为什么一级封锁协议不能保证不读脏数据?在修改的时候不是已经加了X锁了吗为什么其他事务还能读

    一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。

    注意,该协议是规定在修改数据R之前必须加锁。所以如果事务T仅是读数据而不对其进行修改,是不需要加锁的;事务T在修改R之前,其他事务是能对R进行读取的,所以它不能保证可重复读和不读“脏”数据。

    二、SQL多用户访问数据库怎样解决冲突?

    sql多用户访问数据库其实就是事务并发,会引起如下问题:x0dx0a1、脏读:一个事务读取到了另外一个事务没有提交的数据x0dx0a事务1:更新一条数据x0dx0a事务2:读取事务1更新的记录x0dx0a事务1:调用commit进行提交x0dx0a此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。x0dx0a读到的数据为脏数据x0dx0a详细解释:x0dx0a脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,x0dx0a另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个x0dx0a事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。x0dx0a2、不可重复读:在同一事务中,两次读取同一数据,得到内容不同x0dx0a事务1:查询一条记录x0dx0a事务2:更新事务1查询的记录x0dx0a事务2:调用commit进行提交x0dx0a事务1:再次查询上次的记录x0dx0a此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读。x0dx0a3、幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同x0dx0a事务1:查询表中所有记录x0dx0a事务2:插入一条记录x0dx0a事务2:调用commit进行提交x0dx0a事务1:再次查询表中所有记录x0dx0a此时事务1两次查询到的记录是不一样的,称为幻读x0dx0a详细解释:x0dx0a幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,x0dx0a这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表x0dx0a中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,x0dx0a就好象发生了幻觉一样。x0dx0a处理以上隔离级别的问题,采用如下方是:x0dx0a事务隔离五种级别:x0dx0aTRANSACTION_NONE不使用事务。x0dx0aTRANSACTION_READ_UNCOMMITTED允许脏读。x0dx0aTRANSACTION_READ_COMMITTED防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别x0dx0aTRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读,x0dx0aTRANSACTION_SERIALIZABLE可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率x0dx0a以上的五个事务隔离级别都是在Connection接口中定义的静态常量,x0dx0a使用setTransactionIsolation(intlevel)方法可以设置事务隔离级别。x0dx0a如:con.setTransactionIsolation(Connection.REPEATABLE_READ);x0dx0a注意:事务的隔离级别受到数据库的限制,不同的数据库支持的的隔离级别不一定相同x0dx0a1脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更无权参与进来读写,这样就防止了脏读问题。x0dx0a但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。x0dx0a2不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题x0dx0a3幻读问题:采用的是范围锁RangeSRangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。

    三、Access数据库中如何避免脏数据

    脏读dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。

    不可重复的读non-repeatable reads:当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。

    虚读phantom read:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。

    MYSQL事务隔离级别的认识

    2010-08-06 10:27

    在hibernate中如果要连续不间断的保存多个实体的实例,那么在我们保存第一个的时候,其实在数据库里是不存在数据的,即使用Session.flush()也无济于事,这到底是怎么回事呢?让我很是疑惑.......

    在查阅了相关的资料后,原来是数据库对于事务的隔离级别的限制问题,而我原来的MYSQL数据库正好是不支持我上述操作的隔离级别。

    1、在MYSQL中查询事务隔离级别:

    select @@tx_isolation;(tx其实就是transaction的缩写或者习惯缩写法)

    我的结果是REPEATABLE-READ(即可重复读,稍后会引用专业结束文档)

    2、修改MYSQL事务隔离界别:

    set transaction isolation level 目标隔离级别;

    3、再次查询隔离级别进行检验是否已经成功修改。

    这样在修改了隔离级别之后,在进行save()的时候,数据库中就会存在一些数据了,问题解决了。关于其他的数据库产品,思想都是一样的。

    附加、官方的SQL事务隔离级别文档:

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

    Read Uncommitted(读取未提交内容)

    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

    Read Committed(读取提交内容)

    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

    Repeatable Read(可重读)

    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

    Serializable(可串行化)

    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

    四、并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一样的情况?

    大致会产生三类:1、丢失更新2、不可重复读3、读“脏”数据。解决方法:封锁:排他锁(X锁),共享锁(S锁),三级封锁协议,两段锁协议(2PL),其他的我也不清楚了,这些也是我在书上看的,不要见怪!

    以上就是关于读脏数据和不可重复读相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    读脏数据和不可重复读(读脏数据和不可重复读解决)

    博客营销价值的主要表现有(博客营销价值的主要表现有哪些方面)

    杭州的女生好看吗(杭州的女孩子很漂亮吗)