文档章节

高并发请求中的读写锁

IamOkay
 IamOkay
发布于 2014/11/14 07:34
字数 811
阅读 1053
收藏 10
点赞 0
评论 0
  1. 在数据库中使用读写锁

数据库中使用读写锁,这样能更好地读取某一类统计数据,但一般读取不应该加锁,但修改操作却要慎重

事务的特性

 1. 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行

 2. 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。

 3. 隔离性(insulation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

 4. 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。

在j2ee中,hirbernate提供了悲观所和乐观锁,但悲观锁的使用同样也限制了读取的并发性,因此很少使用,二使用最多的是添加乐观锁,在记录中添加版本version或者时间戳字段,这样做并不影响读取,只是按照版本控制的思维来限制低版本记录修改操作,当然有人要问,低版本记录有新的数据,怎么才能更新。

①开启事务->②更新记录前,读取一次最新的数据->③提交->@回滚或者提交事务。

如何保持version和timestamp呢,在提交的过程中,将version或者timestramp进行更新。


参考:http://blog.sina.com.cn/s/blog_4c197d420101awhc.html

           http://blog.sina.com.cn/s/blog_4c197d420101awhc.html

           http://www.cnblogs.com/otomedaybreak/archive/2012/01/27/2330008.html

2.mysql的事务操作

<?php
$handler=mysql_connect("localhost","root","");
mysql_select_db("task");
mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
mysql_query("BEGIN");//开始事务定义
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判断当执行失败时回滚
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROOLBACK");//判断执行失败回滚
}
mysql_query("COMMIT");//执行事务
mysql_close($handler);
?>

3.文件读写锁来解决高并发中的读写问题,当然也可以使用线程同步的方式,进行文件完整性保护

java中实现文件读写锁,就是锁住读写通道

 FileChannel

public class Thread_readFile extends Thread{  
    public void run(){  
        try {  
            Calendar calstart=Calendar.getInstance();  
            sleep(5000);  
            File file=new File("D:/test.txt");      
              
            //给该文件加锁  
            RandomAccessFile fis = new RandomAccessFile(file, "rw"); 
            FileChannel fcin=fis.getChannel();  
            FileLock flin=null;  
            while(true){  
                try {
			flin = fcin.tryLock();
					break;
			} catch (Exception e) {
					 System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒"); 
					 sleep(1000);  
			}
				
            }  
            byte[] buf = new byte[1024];  
            StringBuffer sb=new StringBuffer();  
            while((fis.read(buf))!=-1){                  
                sb.append(new String(buf,"utf-8"));      
                buf = new byte[1024];  
            }  
              
            System.out.println(sb.toString());  
              
            flin.release();  
            fcin.close();  
            fis.close();  
            fis=null;  
              
            Calendar calend=Calendar.getInstance();  
            System.out.println("读文件共花了"+(calend.getTimeInMillis()-calstart.getTimeInMillis())+"秒");  
        }catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}

 写

public class Thread_readFile extends Thread{  
    public void run(){  
        try {  
            Calendar calstart=Calendar.getInstance();  
            sleep(5000);  
            File file=new File("D:/test.txt");      
              
            //给该文件加锁  
            RandomAccessFile fis = new RandomAccessFile(file, "rw"); 
            FileChannel fcin=fis.getChannel();  
            FileLock flin=null;  
            while(true){  
                try {
					flin = fcin.tryLock();
					break;
				} catch (Exception e) {
					 System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒"); 
					 sleep(1000);  
				}
				
            }  
            byte[] buf = new byte[1024];  
            StringBuffer sb=new StringBuffer();  
            while((fis.read(buf))!=-1){                  
                sb.append(new String(buf,"utf-8"));      
                buf = new byte[1024];  
            }  
              
            System.out.println(sb.toString());  
              
            flin.release();  
            fcin.close();  
            fis.close();  
            fis=null;  
              
            Calendar calend=Calendar.getInstance();  
            System.out.println("读文件共花了"+(calend.getTimeInMillis()-calstart.getTimeInMillis())+"秒");  
        }catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
    }  
}


© 著作权归作者所有

共有 人打赏支持
IamOkay
粉丝 187
博文 449
码字总数 367264
作品 0
海淀
程序员
mysql处理高并发,防止库存超卖

先来就库存超卖的问题作描述:一般电子商务网站都会遇到如团购、秒杀、特价之类的活动,而这样的活动有一个共同的特点就是访问量激增、上千甚至上万人抢购一个商品。然而,作为活动商品,库存...

凯文加内特 ⋅ 2016/01/25 ⋅ 0

如此牛逼?双11背后的秘密-支付宝app双11最佳实践

近来,FF项目的运营活动越来越多,对于架构设计以及程序研发有了更高的要求,参考国内互联网公司对于营销活动app的设计思路,我们找到了最具有代表性的支付宝双11活动,阐述运营活动类高并发...

丁小晶 ⋅ 2016/04/20 ⋅ 0

Java使用读写锁替代同步锁

应用情景 前一阵有个做反抄袭检测的小伙伴问了我一个问题。 --- 在多线程里就是有个变量,我需要读取它来判断是否给它写入一些信息。 打算加锁,但是如果读取时候加入readlock,写入时候加入...

野梦M ⋅ 2017/11/28 ⋅ 0

mysql查询更新时的锁表机制分析

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。 一、概述 MySQL有三种锁的级别:页级、表级、行级。 MyISAM和MEMORY存储引擎采用的是表级锁(table-l...

桔子 ⋅ 2013/06/28 ⋅ 3

Java多线程---锁

“锁”是较为常用的同步方法之一。在高并发环境下,激励的锁竞争会导致程序的性能下降。所以我们们将在这里讨论一些有关于锁问题以及一些注意事项。比如: 避免死锁 减少锁粒度 锁分离 在多核...

Jansens ⋅ 2016/12/01 ⋅ 0

[高并发Java 九] 锁的优化和注意事项

锁优化的思路和方法 在[高并发Java 一] 前言中有提到并发的级别。 一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点。 这里提到的锁优化,是指在阻塞式的情况...

Hosee ⋅ 2016/02/16 ⋅ 0

java并发编程(十二): 显示锁

显示锁: Lock与ReentrantLock: Lock接口 void lock(); //获取锁void lockInterruptibly() throws InterruptedException; //获取锁,且当前线程可被中断boolean tryLock(); //尝试获取锁,t...

ihaolin ⋅ 2014/04/27 ⋅ 0

Java高级上锁机制:显式锁 ReentrantLock

Java 5.0 加入了新的上锁工作:ReentrantLock,它和同步(Synchronized)方法的内置锁不同,这是一种显式锁。显式锁作为一种高级的上锁工作, 是同步方法的一种补充和扩展,用来实现同步代码块...

登高且赋 ⋅ 2017/11/17 ⋅ 0

【多线程】ReentrantReadWriteLock读写锁

一、前言 读写锁ReentrantReadWriteLock,其核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。之前学synchronized、ReentrantLock时,同一时间内,只...

qq_26545305 ⋅ 02/04 ⋅ 0

阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统

秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升...

xqtesting ⋅ 2017/12/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部