- 浏览: 199434 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (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 421Queue 一、Queue ConcurrentLink ... -
容器集合
2017-08-19 18:18 363容器 一、同步类容器 1.概念 同步类容器都是线程安全的, ... -
多线程-单例模式
2017-08-17 20:59 320单例模式 一、概念 饿汉模式、懒汉模式 二、示例 ... -
ThreadLocal
2017-08-17 21:02 270ThreadLocal 一、概念 ThreadLocal ... -
线程间通信 wait notify
2017-08-15 22:12 393线程间通信 一、通信 线程通信概念:线程是操作系统中独立的 ... -
Volatile
2017-08-14 22:11 361Volatile 一、概念 volatile : 作用是保 ... -
Synchronized
2017-08-13 18:46 365Synchronized 一、锁重入 1.概念 关键字 s ... -
线程安全
2017-08-12 20:55 349线程安全 一、线程安全 线程安全概念: 当多个线程访问某一 ... -
Lock
2017-04-19 22:39 468Lock 一、 1. public class ... -
ExecutorService
2017-04-17 22:32 754ExecutorService 1. 线程池的意义: 维护一 ... -
CountDownLatch
2017-04-16 12:38 408一、CountDownLatch 一个同步辅助类,在完成一组 ... -
ConcurrentHashMap
2017-04-16 11:01 314一、 hashMap线程不安全hashTable线程安全,对 ... -
BlockingQueue
2017-04-15 22:40 510参考内容:http://tool.oschina.net/ap ...
相关推荐
数据并发的问题 (脏读、不可重复读、幻象读)和数据库锁机制
并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。并发机制不正确可能导致脏读、幻读和不可重复读等此类问题。
48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.pdf
行业-48 多个事务并发更新以及查询数据,为什么会有脏写和脏读的问题?l.rar
数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID): 1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...
数据库锁(行锁,表锁,共享锁,排他锁) 行锁 我们知道mysql的Innodb引擎是支持行锁的,与Oracle不同,mysql的行锁是通过索引加载的,即行锁是加载索引响应的行上的,要是对应的SQL语句没有索引,则会走表锁。...
如果你看到了这篇文章,那么我会默认你了解了 脏读 、不可重复读与可重复读。 1. 多版本并发控制(MVCC)(快照读) 多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。 以 InnoDB 为例,每一行...
脏读:一个事务读到了另一个事务的未提交的数据 不可重复读:一个事务读到了另一个事务已经提交的update的数据导致多次查询结果不一致. 虚幻读:一个事务读到了另一个事务已经提交的insert的数据导致多次查询结果不一致...
通过具体的例子实现。通过三级封锁机制实现并发操作导致的数据不一致(丢失更新问题、读过时的数据、读“脏”数据)。
# 设置⼯作空间 # 把"数据及程序"⽂件夹拷贝到F盘下,再⽤setwd设置⼯作空间 setwd("F:/数据及程序/chapter3/⽰例程序") # 读⼊数据 saledata (file = "./data/catering_sale.csv", header = TRUE) # 缺失值检测 并...
mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决方案mysql备份解决...
脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A...
所谓悲观锁,总是假设最坏的情况,每次去拿数据的时候都会认为别人会修改数据,造成幻读,不可重复读,脏读等情况发生。所谓乐观锁,重视假设最好的情况,每次去拿数据都认为别人不会修改,所以不会上锁,但是会在...
脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并...
前段时间帮同事处理了一个把 CSV 数据导入到 MySQL 的需求。两个很大的 CSV 文件, 分别有 3GB、2100 万条记录和 7GB、3500 万条... 注意处理脏数据导致的异常 原始数据是 GBK 编码,所以还要注意转换成 UTF-8 用 cli
◆脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 ◆不可重复读 A用户读取数据,随后B用户读出该数据并修改...
脏读 T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。 不可重复读 T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的...
主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题。 作用 ZooKeeper 本质上是一个分布式的小文件存储系统。 通过监控这些数据状态的变化,从而可以达到基于数据的集群...
为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。 ...
主要共享的就是一个sheet对象和访问列标row_number,由于对数据表只是读操作,写操作在单独对一列,所以觉得应该没有脏读对问题,所以对于sheet对象没有使用对象锁, 对于row_number因为我在代码里多次用到,包括...