数据库的数据脏读是什么意思,怎样有效的避免数组脏读,博客

数据库的数据脏读是什么意思,怎样有效的避免数组脏读,博客,第1张

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的 *** 作可能是不正确的。

1、如果都未更新你就读取了,或者都更新完才读取,这都不是脏读,因为得到的是更新前的有效值,或完全更新后的值。

2、如果那个用户更新一半你就读取了,也就是说更新了A,正打算要更新B但尚未更新时,就读取了,此时得到的就是脏数据。

避免脏读的办法就是采取事务,使得用户正在更新时锁定数据库,阻止你读取,直至全部完成才让读取。

扩展资料:

在数据库技术中,脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。

参考资料来源:百度百科-脏数据

锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时 *** 纵同一个数据库中的数据而不发生数据不一致现象的重要保障。 一般来说,锁可以防止脏读、不可重复读和幻觉读。

事务并发产生的问题:

        脏读:一个事务读取到了另外一个事务没有提交的数据

            事务1:更新一条数据

                             ------------->事务2:读取事务1更新的记录

            事务1:调用commit进行提交       

            ***此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。

            ***读到的数据为脏数据

            详细解释:

                脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,

                另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个

                事务读到的这个数据是脏数据,依据脏数据所做的 *** 作可能是不正确的

        不可重复读:在同一事务中,两次读取同一数据,得到内容不同

            事务1:查询一条记录

                            -------------->事务2:更新事务1查询的记录

                            -------------->事务2:调用commit进行提交

            事务1:再次查询上次的记录

            ***此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读

        幻读:同一事务中,用同样的 *** 作读取两次,得到的记录数不相同

            事务1:查询表中所有记录

                              -------------->事务2:插入一条记录

                              -------------->事务2:调用commit进行提交

            事务1:再次查询表中所有记录     

             ***此时事务1两次查询到的记录是不一样的,称为幻读

            详细解释:

                幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,

                这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表

                中插入一行新数据。那么,以后就会发生 *** 作第一个事务的用户发现表中还有没有修改的数据行,

处理以上隔离级别的问题,采用如下方是:

事务隔离五种级别:

        TRANSACTION_NONE  不使用事务。

        TRANSACTION_READ_UNCOMMITTED  允许脏读。

        TRANSACTION_READ_COMMITTED  防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别

        TRANSACTION_REPEATABLE_READ  可以防止脏读和不可重复读,

        TRANSACTION_SERIALIZABLE  可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率

以上的五个事务隔离级别都是在Connection接口中定义的静态常量,

使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。

        如:con.setTransactionIsolation(Connection.REPEATABLE_READ)

注意:事务的隔离级别受到数据库的限制,不同的数据库支持的的隔离级别不一定相同


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10826484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存