精华内容
下载资源
问答
  • 面对web并发访问时候,可能产生这样的问题,你是怎么设计的一般的web application,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到...

    面对web并发访问时候,可能会产生这样的问题,你是怎么设计的 <script src="http://blog.csdn.net/count.aspx?ID=2132163&Type=Rank" type="text/javascript"></script>

    一般的web application,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到这条记录,删除之,然后再回到第一个窗口点击保存按钮。

    假如程序没有做特别的处理,肯定会报错。

    这个问题,有些公司并不考虑这样的问题,认为这个发生的概率很低,报错就报错吧,反正概率很低。 

    是这样的,假如是一般的小的系统,访问人数和并发数不是很多的时候,基本上不太用考虑。但是一个大的,比如说海关,银行,或者在线电子商务网站,基于系统健壮性考虑,你不得不考虑。。。

    目前一个通用的做法有两种:

    锁机制:1.悲观锁;2.乐观锁。

    在web程序里,基本上不能考虑悲观锁(会使得系统的产生不可估量额性能损失,也失去了web 的意义了。)

    当然在web程序里只能乐观锁,一个通用的做法就是每张表里设置一个字段version_no,每次删除或者修改的时候,去数据库比较一下,数据库的version_no还变化了,假如不等了,就说明在你之前发生过了变化了,这次修改或者删除动作不能成功。。。

    我们在做系统的时候,由于系统初期没有考虑到,到了后来用户测试的时候,出现了这样的问题,我们就是在我们的basicDao里做了一次检查,如果不对劲就throw一个exception,在basicDao里使用了模版技巧用来保证dao和service层不用改变方法的申明,保证了这个改变影响的代码降到了最低。

    但是这里有一个问题,假如是使用hibernate3技术,假如你update的时候,由于特殊的情况,你得使用merge(bo)方法---否则你会遇到a different Object with same indicator in a session,那样就会带来一个新的问题,假如你不做一点处理,hibernate发现你的这条记录已经删除了,他会automagiclly create一条新的记录到数据库里。 

    展开全文
  • 【多线程并发访问的安全性问题

    千次阅读 2019-01-06 12:07:32
    今天重新温习了一下多线程并发访问的问题,加强下记忆,决定写一些东西记录下来。【持续更新】 多线程并发访问的安全性问题 首先要知道的是:多线程安全性问题产生的原因是什么? 多线程并发访问是指当多个线程无序...

    【多线程并发访问的安全性问题】

    今天重新温习了一下多线程并发访问的问题,加强下记忆,决定写一些东西记录下来。【持续更新】
    

    多线程并发访问的安全性问题

    首先要知道的是:多线程安全性问题产生的原因是什么?

    多线程并发访问是指当多个线程无序的访问同一个共享资源时,这个线程就受到了“多个线程的并发访问”。

    多线程并发访问的安全问题

    在出现多个线程并发访问的时候,这时就有可能产生并发访问的安全性问题,可能会导致共享资源的最后结果不是我们期望的结果。(此处不做具体演示)

    该如何解决多线程并发访问的安全问题呢?

    利用【线程同步】可以解决多线程并发访问的安全性问题。

    线程同步的方式有三种:(如果还有其他方式,欢迎诸位大佬补充)
    1. 同步方法【最常用】
    2. 同步代码块
    3. Lock锁(JDK1.5以后新出的锁)
    同步方法

    我这里写一个方法:

    public synchronized int getNumber(){
    //被同步的代码。。
    }
    

    当一个线程进入到方法时,会立即锁死这个方法,其他线程会在外边等待。为啥呢?因为在加了synchronized同步锁之后,其他线程进不来,当内部的线程线程执行完之后,其他的线程才能进来,以此类推。这样可以保证每个线程可以完整的执行完,这样就避免了多线程并发访问的安全问题。

    同步代码块

    通过锁对象,来完成对线程的同步。

    private Object obj = new Object();
    public synchronized int getNumber(){
      synchronized(obj){
       //被同步的代码。。
      }
    }
    
    

    这里是通过锁对象,保证多个线程进来后,访问到的都是一个对象,来完成对线程的同步。它可以出现在方法内部,一个方法内可以有多个同步代码块。

    Lock锁

    Lock它是一个接口,是在JDK1.5以后新出的锁。它的具体实现类诸位可自行查阅。

    Lock lock = new Lock的实现类
    public synchronized int getNumber(){
      lock.lock();//加锁
      try{
         //被同步的代码。。
      }finally{
        lock.unlock();//解锁
         }
      }
    

    ···························································································································································
    写的东西不算多,欢迎诸位大佬补充。
    持续更新,共同进步!

    展开全文
  •  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前状态,所有操作就像没有发生一样。也就是说事务是一个不可分割...

    一、事务的基本要素(ACID)

       1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

       2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

       3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

       4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    二、事务隔离级别和各个级别的并发访问问题。

    
    1、更新丢失(MySQL所有事务隔离级别在数据库层面上均可避免)
    事务A对数据进行操作时,事务B也在对同一数据更新操作并完成了提交,然后事务A遇到异常进行回滚导致事务B的更新丢失。
    
    2、脏读
    一个事务读到另一个事务未提交的数据。
    
    3、不可重复读
    事务A在多次读取同一数据的过程中,事务B对数据进行更新并提交,导致事务A多次读取同一数据时结果不一致。
    
    4、幻读
    事务A读取若干行数据,事务B以插入或删除行的方式来修改事务A的结果集。
    
    其中不可重复读与幻读比较相似,不可重复读侧重对同一数据的修改,幻读侧插入增或删除数据。
    事务隔离级别越高,对性能的影响也越大。



    mysql默认是可重复读、oracle默认是已提交读。

     

     

     

    转载于:https://www.cnblogs.com/ZuoAndFutureGirl/p/10473483.html

    展开全文
  • 一般的web application,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到这条记录,删除之,然后再回到第一个窗口点击保存按钮。...

    一般的web application,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到这条记录,删除之,然后再回到第一个窗口点击保存按钮。

    假如程序没有做特别的处理,肯定会报错。

    这个问题,有些公司并不考虑这样的问题,认为这个发生的概率很低,报错就报错吧,反正概率很低。 

    是这样的,假如是一般的小的系统,访问人数和并发数不是很多的时候,基本上不太用考虑。但是一个大的,比如说海关,银行,或者在线电子商务网站,基于系统健壮性考虑,你不得不考虑。。。

    目前一个通用的做法有两种:

    锁机制:1.悲观锁;2.乐观锁。

    在web程序里,基本上不能考虑悲观锁(会使得系统的产生不可估量额性能损失,也失去了web 的意义了。)

    当然在web程序里只能乐观锁,一个通用的做法就是每张表里设置一个字段version_no,每次删除或者修改的时候,去数据库比较一下,数据库的version_no还变化了,假如不等了,就说明在你之前发生过了变化了,这次修改或者删除动作不能成功。。。

    我们在做系统的时候,由于系统初期没有考虑到,到了后来用户测试的时候,出现了这样的问题,我们就是在我们的basicDao里做了一次检查,如果不对劲就throw一个exception,在basicDao里使用了模版技巧用来保证dao和service层不用改变方法的申明,保证了这个改变影响的代码降到了最低。

    但是这里有一个问题,假如是使用hibernate3技术,假如你update的时候,由于特殊的情况,你得使用merge(bo)方法---否则你会遇到a different Object with same indicator in a session,那样就会带来一个新的问题,假如你不做一点处理,hibernate发现你的这条记录已经删除了,他会automagiclly create一条新的记录到数据库里。 

    展开全文
  • 参考资料: 《数据库事务管理基础知识》 《sqlserver锁机制》 《Understanding Locking in SQL Server》 《深入解析SQL Server2008-事务和并发性》 两种并发模型 悲观并发 数据库表现很悲观,总是假设会出现冲突,...
  • 1、 如果redis宕机了,或者链接不上,怎么办?解决方法: ①配置主从复制,配置哨兵模式(相当于古代门派长老...2、 如果redis缓存在高峰期到期失效,在这个时刻请求会向雪崩一样,直接访问数据库如何处理? ...
  • 产生并发访问问题的核心原因在于多个线程同时访问了一个共享数据 线程中共享数据 1.方法中局部变量:一定不是共享数据,因为每次调用方法都会创建新局部变量; 2.类中非静态变量:有可能是共享数据,也可是...
  • 但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计潜在问题,一些不易捕捉死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起键查找死锁及相关解决办法. 这里我们在测试同时开启...
  • Java多线程之对象及变量的并发访问

    千次阅读 2017-02-21 21:35:52
    Java对象及变量的并发访问当多个线程同时对同一个对象中的实例变量进行并发访问可能会产生线程安全问题产生的后果就是”脏读”,即收到的数据其实是被更改过的。 如果访问的是方法中的变量,则不存在”非线程...
  • 首先简单介绍一下并发可能存在的问题: 在多用户都用事务同时访问同一个数据资源的情况下,就会造成以下几种数据错误。 更新丢失:多个用户同时对一个数据资源进行更新,必定会产生被覆盖的数据,造成数据读写异常...
  • 多个用户访问同一个数据库时,如果他们事务同时使用相同数据,则可能会导致并发问题的产生并发操作带来数据库不一致性可以分为四类:(1)丢失或覆盖更新当两个或多个事务选择同一数据,并且基于最初选定...
  • Java多线程-变量并发访问

    千次阅读 2018-03-25 17:25:04
    非线程安全:多个线程堆同一个对象的实例变量进行并发访问时,产生“脏读”,取到的数据是被更改过的。 线程安全:获取实例变量时,经过同步处理。 “非线程安全”的问题在于“实例变量”中,方法内部的私有变量是...
  • synchronized解决的问题:当多个线程对同一个对象中的实例变量进行并发 访问时,可能产生“脏读”,也就是取的的数据其实是被更改过的数据,即“非线程 安全”现象。而synchronized可以让多线程对方法或语句块...
  • Sqlserver2000中的并发问题一、并发问题的产生:如果没有锁定且多个用户同时访问一个数据库,则当他们事务同时使用相同数据时可能会发生问题并发问题包括: 丢失或覆盖更新。 未确认相关性(脏读)。 不一致...
  • 但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计潜在问题,一些不易捕捉死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起键查找死锁及相关解决办法. 这里我们在测试同时开启...
  • Redis高并发问题

    2020-06-11 19:07:17
    Redis高并发可能产生的问题 redis宕机或者连接不上 解决方法: 配置主从复制,配置哨兵模式,一旦发现主机宕机,让下一个从机当做主机。 最坏的情况,只能关闭Redis连接,去往数据库连接。但由于数据量大,这样SQL...
  • 但有时因为一些特殊应用场景如高频查询,高并发查询下由于数据库设计潜在问题,一些不易捕捉死锁可能出现从而影响业务.这里为大家介绍由于设计问题引起键查找死锁及相关解决办法. 这里我们在测试同时开启...
  • 详细代码见:github代码地址   本节内容: 1) 多线程死锁条件 2) 成员内部类和静态内部类同步 ...3) 锁对象改变和锁对象属性的改变 ...Java线程死锁是一个经典的多线程问题,因为不同的...Java死锁产生的四个必要条件:...
  • 多事务要是对缓存页里的同一条数据同时进行更新或者查询,此时会产生:脏读,脏写,不可重复读,幻读的问题 脏写 两个事务,事务A和事务B同时更新一条数据,事务A先把它更新为A值,事务B紧接着就把他...
  • 为了解决数据库并发事务时,可能产生的数据不一致,数据库提供了隔离级别和锁。 数据库中并发事务出现的问题 1)脏读:数据库并发访问的情况下,不同的事务对同一条数据操作,事务A修改数据未提交时,事务B读取了...
  • sqlserver2000中的并发问题一、并发问题的产生:如果没有锁定且多个用户同时访问一个数据库,则当他们事务同时使用相同数据时可能会发生问题并发问题包括: 丢失或覆盖更新。未确认相关性(脏读)。不一致...
  • 对于web项目,随着用户量的增加就有可能产生并发的问题。高并发简单的来说就是在同一时刻不同用户访问同一资源的问题,专业一点的说法就是在同一时刻有多个线程访问了同一个数据资源。(网站的访问量非常大的话,...
  • 关于并发的一些想法

    2019-01-25 14:39:27
    这里造成的并发的问题是由于用户过多发出的http的请求过多,程序排队处理这些请求,同时,对于同一个数据库和同一tomcat来承受这些请求(可能千万个请求),同时服务器的cpu和内存等都会有问题,必然导致用户响应界面...
  • 但是多核多线程也会带来很多并发问题,其中很重要一个问题是数据竞争,数据竞争即多个线程同时访问共享数据而导致了数据冲突(不正确)。数据竞争如果没处理好则意味着整个业务逻辑可能出错,所以在高并发环境中...
  • 在同一程序中运行多个线程本身不会导致问题问题在于多个线程访问了相同资源。当多个线程同时访问同一个资源,并且其中一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源...
  • 我对高并发的理解

    千次阅读 2017-04-20 14:22:10
    并发的产生对于web项目,随着用户量的增加就有可能产生并发的问题。高并发简单的来说就是在同一时刻不同用户访问同一资源的问题,专业一点的说法就是在同一时刻有多个线程访问了同一个数据资源。解决方案目前...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 347
精华内容 138
关键字:

并发访问可能产生的问题