- 浏览: 210820 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
脏读
一、概念
数据写入与数据读出不一致
原因:未对写入与读出做整体性的处理,导致与预期结果不一致
二、例子
假设:
写入两个数据,第一个数据写入需4s,然后写入第二个数据
线程启动后,1s,需读取数据。
若:只对写进行 synchronized 处理,未对 读进行同样处理,就会出现脏读
package com.study.current.thread.day01; /** * 脏读 * 在数据写入过程未完成的情况下,去读取数据 * * 假设写入需 4s * 等待1s后读取数据 * * 结论: * 考虑问题一定要考虑整体性 */ public class DirtyRead extends Thread { private String name = "abc"; private String pass = "123"; public synchronized void setValue(String name ,String value){ this.name = name ; try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } this.pass = value ; System.out.println("setValue name:"+name +" pass:"+value); } /** * 若读取数据时未加 synchronized * 输出结果: * name:bcd pass:123 setValue name:bcd pass:345 写入的数据与读出的数据会不一致 */ public synchronized void getValue(){ System.out.println("name:"+this.name + " pass:"+this.pass); } /** * @param args */ public static void main(String[] args) { final DirtyRead thread = new DirtyRead(); Thread t1 = new Thread(new Runnable() { public void run() { thread.setValue("bcd", "345"); } }); t1.start(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } thread.getValue(); } }
三、实例总结:
在我们对一个对象的方法加锁的时候,需要考虑业务的整体性,即为 setValue getValue
方法同时加锁 synchronized 同步关键字,保证业务 service 的原子性,不然会出现脏读
也从侧面保证业务的一致性
四、拓展
关系型数据的ACID原则:
假设
9:00 开始查询一个列表,数据量在1000W,未加索引,全表扫描,需10min处理完毕
9:05 执行一个DML 语句,修改某个字段值,由100改为200
9:10 的查询结果中是100 or 200 ?
答案: 100
数据查询会保留一份数据的快照,9:00查询就是9:00这一刻的数据的快照,而不会因为9:05修改数据,导致查询结果的变化
数据读的一致性。
另外:关系型数据库会拷贝旧值,如果commit 操作失败,会还原原有的数据
发表评论
-
Queue
2017-08-21 21:26 464Queue 一、Queue ConcurrentLink ... -
容器集合
2017-08-19 18:18 405容器 一、同步类容器 1.概念 同步类容器都是线程安全的, ... -
多线程-单例模式
2017-08-17 20:59 357单例模式 一、概念 饿汉模式、懒汉模式 二、示例 ... -
ThreadLocal
2017-08-17 21:02 299ThreadLocal 一、概念 ThreadLocal ... -
线程间通信 wait notify
2017-08-15 22:12 434线程间通信 一、通信 线程通信概念:线程是操作系统中独立的 ... -
Volatile
2017-08-14 22:11 401Volatile 一、概念 volatile : 作用是保 ... -
Synchronized
2017-08-13 18:46 413Synchronized 一、锁重入 1.概念 关键字 s ... -
线程安全
2017-08-12 20:55 392线程安全 一、线程安全 线程安全概念: 当多个线程访问某一 ... -
Lock
2017-04-19 22:39 512Lock 一、 1. public class ... -
ExecutorService
2017-04-17 22:32 785ExecutorService 1. 线程池的意义: 维护一 ... -
CountDownLatch
2017-04-16 12:38 442一、CountDownLatch 一个同步辅助类,在完成一组 ... -
ConcurrentHashMap
2017-04-16 11:01 345一、 hashMap线程不安全hashTable线程安全,对 ... -
BlockingQueue
2017-04-15 22:40 539参考内容:http://tool.oschina.net/ap ...
相关推荐
如果前一个事务最终回滚,那么后一个事务获取的数据就是无效的,这种情况被称为脏读。 - **示例**:假设事务A更新了一条记录但尚未提交,事务B读取了这条记录。如果之后事务A回滚,事务B读取的就是脏数据。 2. **...
脏读(Dirty Read)是指事务读取了另一个事务未提交的数据。如果第一个事务回滚了修改操作,那么第二个事务读取的数据就可以看作是从未存在过的。例如,Transaction 1 修改了一行数据,然后 Transaction 2 在 ...
数据并发的问题 (脏读、不可重复读、幻象读)和数据库锁机制
开发智能的异常检测算法来识别和过滤脏读数据;利用统计学方法估计漏读数据的概率,并设计相应的补充读取策略。 3. 结语 随着物联网技术的发展和RFID技术应用的普及,对RFID中间件数据处理模型的研究变得越来越...
脏读发生在事务T1读取了事务T2还未提交的修改数据,然后T2因为某种原因回滚了更改。在这种情况下,T1读到的数据实际上是错误的,因为它不是最终提交的状态。不可重复读则涉及事务在不同时间读取同一数据集时看到不同...
而脏读发生在事务A对数据进行更改但还未提交时,事务B读取了这些未提交的数据。如果事务A随后回滚,事务B读到的数据就是无效的,因为这些数据从未真正存在于数据库中。这样,事务B就“读取”了脏数据,即脏读。 ...
脏读则是指一个事务读取到了另一个事务未提交的修改数据。在这种情况下,如果那个未提交的事务最终回滚,那么读取到的数据就是无效的,这同样违反了事务的隔离性。举例来说,事务B读取了事务A还未提交的更新,然后...
1. 脏读:事务A读取了事务B未提交的数据,如果B回滚,A读到的就是无效的脏数据。 2. 不可重复读:事务A在不同时间读取同一数据,由于B的修改,两次读取结果不一致。 3. 幻读:事务A在同一查询中多次读取数据,期间...
对于不可重复读的代码示例,原理与脏读类似,但是在此情境下,主要目的是让事务读取了相同的数据两次,而在这两次读取之间,另一个事务修改了数据,导致读取结果不一致。 至于幻读,它涉及到范围查询中新增的数据,...
这些协议旨在解决并发操作带来的三种主要数据不一致问题:丢失更新、读过时数据和读“脏”数据。 1. **丢失更新问题**: 这个问题发生在两个事务 T1 和 T2 都读取并修改同一数据。T1 完成修改并提交,但 T2 的修改...
数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID): 1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...
脏读是指一个事务读取了另一个事务未提交的数据。如果后一个事务回滚了,那么前一个事务读到的数据就是无效的,这种现象在数据库操作中是不允许的。脏写则指的是两个事务同时写入同一个数据项,如果没有适当的控制,...
1. **读未提交**:在这一级别,事务可以读到其他事务未提交的更改,这可能导致脏读(Dirty Reads),即事务读取到的数据可能是临时的、错误的。 2. **读已提交**:在此级别,事务只能看到其他事务已经提交的更改。...
脏读发生在当一个事务读取了另一个未提交事务的修改数据。如果未提交的事务随后回滚,那么读取到的数据实际上是无效的,这就像看到的是海市蜃楼一样,看似有物,实则虚幻。 不可重复读指的是在一个事务内多次读取...
在这种级别下,每次查询都会获取当前的数据库状态,所以可以防止脏读,但不能防止不可重复读和幻读。Oracle 数据库默认采用的就是这个隔离级别。在 MySQL 中,如果我们把两个连接的事务隔离级别都设置为提交读,那么...
当多个用户同时访问数据库时,如果没有适当的并发控制机制,可能会导致数据不一致、更新丢失或脏读等问题。本文将探讨如何设计有效的数据库并发控制机制。 数据库的并发控制是确保在多用户环境中数据库的完整性和...
这种方式可以防止脏读、幻读和不可重复读,因为它确保了每个数据对象的独立锁定和解锁。 5. 可重复读 (Serializable) 可重复读是GBase 8s的最高隔离级别,类似于其他数据库系统的"可串行化"。在该级别下,事务在...
例如,在读未提交(READ UNCOMMITTED)级别下,脏读可能导致并行更新看到未提交的数据,而在可重复读(REPEATABLE READ)或串行化(SERIALIZABLE)级别下,幻读或不可重复读可能导致数据丢失。 4. **数据分区**:在...
如果你看到了这篇文章,那么我会默认你了解了 脏读 、不可重复读与可重复读。 1. 多版本并发控制(MVCC)(快照读) 多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。 以 InnoDB 为例,每一行...
- 可重复读(Repeatable Read):在同一事务内,多次读取相同数据的结果保持一致,防止脏读和不可重复读,但可能存在幻读。 - 串行化(Serializable):最严格的隔离级别,通过锁定所有涉及的行,确保事务按顺序执行...