开发者社区> 问答> 正文

WEB应用多线程疑问?报错

刚在复习多线程的时候突然有个疑问:

我们都知道WEB容器对于每个请求都是启动一个多线程来处理,那不是所有业务层的代码都要考虑到同步问题。举两个场景:

1. 业务层类有个全局变量count,某个方法使count++,如果两个请求同时调用该方法,count不就有可能+2了,反正就是典型的同步问题。我的意思就是所有业务层代码都要考虑同步?

2. 两个人同时打开了一个单据页面,一个人通过单据页面的删除按钮删除了该单据,另一个人再对该单据执行任意操作不就报错了,这种情况大家是怎么处理的?难道所有操作在业务层代码都要判断该单据是否已被删除?

3. Hibernate进行数据库操作如insert,update,delete有没默认的锁机制?这个机制是怎样的?

望大家指点。

展开
收起
爱吃鱼的程序员 2020-06-22 16:58:37 471 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    1.如果是单例的而且是修改成员变量需要考虑2.根据事务的隔离级别不同,就是是否允许出现幻读和脏读。3.hibernate的操作都是有事务的,只是根据需要配置不同的隔离级别,你也可以使用乐观锁和悲观锁

    这个大体是这样的,web的服务,比如servlet这些都是多线程的。但是具体的方法内部其实已经同步过了,比如doPost或者doGet方法,这些方法内部并不需要考虑多线程的问题。其实哪个线程提供了服务都是无所谓的,http本身是无状态的,因此需要session来记录一些信息。

    你说的第二个问题其实和第三个问题有些相似,大体上都是数据库事物的问题。如果是处理事物,数据库自己就会加锁,并不需要我们干预。数据库服务本身就是支持并发的,它总是能够支持多个连接同时访问,但对于事物操作执行总是耗时的。这涉及数据库并发的知识。。。


    他的第一个问题是和web服务无关的,全局变量的修改在多线程环境下肯定需要同步++那个要考虑,数据库删除,就不用考虑了每次访问action都是重新new的,但是service都是用的同一个(典型的ssh场景),因此如果在service里定义了共享变量,就需要考虑同步问题。只用过struts1,本来是不是new,但是action一般会定义属性来封装请求参数,这样就必须把action设为非单例。struts1springmvc都不是new第三种的话是数据库的自己的同步,跟事务隔离级别有关。第二种的话删除操作其实只要保证程序正常就行,你原来删除一个不存在的数据肯定需要兼容提示吧。更多的是更新操作,两个人同时读取后更新,这个就需要引入版本号字段。

    1、需不需要同步是要根据你的业务来考虑,普通的方法,一直就不是同步的方法。如果这个count是个浏览数,可以不同步,丢个10个8个浏览数也无所谓

    2、第二个问题就是我打开了你的帖子,回答问题,提交之前,<atarget="_blank"rel="nofollow">@红薯已经把你的帖子删了,这个时候如果不判断可能会报错,也可能不会报错,具体也得看你的业务有没有这个要求和数据库表的设计,比如这种情况发生的几率有多大,如果是osc这种情况的话,就很少。如果删除和修改都很大的情况下,可以考虑判断一下,再比如就是需要判断,不能出现sql错误。。。那就判断吧,在比如delete只是改个flag,你update的时候没有whereflag条件,更新还能成功呢。。

    3、hibernate好久不用,不过hibernate的<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">insert,update,delete默认肯定是没有同步的,需要你自己配置,不配置代码不能自己知道哪个操作需要同步吧

    1.++必须要考虑,自己同步,否则业务数据出问题,严重

    2.删除/更新问题,一般不考虑,因为即使出错,也是抛出Exception,单个Request失败,只要不影响数据,就可以不考虑,只要做好全局的RuntimeException捕获就可以了。

    3.数据库的自身的同步,一般研发可以不考虑。

    尽量避免业务类全局变量多线程下操作,也可以用jdk的并发库来解决。

    2020-06-22 16:58:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Web应用系统性能优化 立即下载
高性能Web架构之缓存体系 立即下载
PWA:移动Web的现在与未来 立即下载