Java解决多人同时操做的解决方案 实际例子介绍

Java解决多人同时操做的解决方案 实际例子介绍,第1张

原文   https://my.oschina.net/u/863334/blog/683899

简介

最近公司在作团购这块的一个商品的促销活动,在建立促销的时候发现只能有一个用户进行修改和编辑,若是其余用户操做同一个促销活动就会出现数据不一致,这也就是咱们常常遇到的多人同时操做的问题,下面我将详细介绍关于这块咱们的解决方案java

出现数据不一致的现象一般分为两种:1.覆盖更新 2.脏读数据库

关于这类问题通常会考虑到用数据库的机制来解决并发

数据库锁分为乐观锁和悲观锁性能

乐观锁

乐观锁并不锁住任何东西,而是在提交事务时检查本身上次读取这条记录后,是否有其余事务修改了这条记录,若是没有则提交,若是被修改了则回滚。若是并发的可能性并不大,那么锁定策略带来的性能消耗是很是小的spa

悲观锁

与乐观锁相比,悲观锁则是一把真正的锁了,它经过SQL语句“select for update”锁住数据,这时若是其余事务来更新时会等待,悲观锁会锁住整张表,性能较低,致使其余的事务不能访问code

实例介绍

接下来对于这块我采用的是乐观锁的方案,关于实现乐观锁有三种方式:
1.是为数据表增长一个version字段,每次事务开始时,取出version,在提交事务时,检查version是否有变化
若是没有变化提交事务时将version + 1,SQL差很少是这样:事务

UPDATE t_promotionset version = version + 1where promotionid = ?and version = ?

2.是为数据表增长一个时间戳字段,而后经过比较时间戳检查该数据是否被其余事务修改过。
3.是检查对应的字段的值有没有变化io

这里采用第一种方式 ,第二种跟第一种很相似 第三种性能不高class

总结笔记原理

解决多人同时操做问题解决方案:
1.采用数据库锁的机制
乐观锁的实现方案:
就是在提交事务时检查本身上次读取这条记录后,是否有其余事务修改了这条记录,若是没有则提交,若是被修改了则回滚

通常有三种方式实现乐观锁: 
(1).是为数据表增长一个version字段,每次事务开始时,取出version,在提交事务时,检查version是否有变化
若是没有变化提交事务时将version + 1,SQL差很少是这样:UPDATE T_IRS_RESOURCEset version = version + 1where resource_id = ?and version = ?
(2).是为数据表增长一个时间戳字段,而后经过比较时间戳检查该数据是否被其余事务修改过。
(3).是检查对应的字段的值有没有变化。

ibatis实现乐观锁解决方案的实现原理
使用数据版本(Version)记录机制实现,这是乐观锁最经常使用的一种实现方式。何谓数据版本?即为数据增长一个版本标识,通常是经过为数据库表增长一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一,当咱们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,若是数据库表当前版本号与第一次取出来的version值相等,则予以更新,不然认为是过时数据


举例:
那么为了使用乐观锁,咱们首先修改t_goods表,增长一个version字段,数据默认version值为1。
<update id="updateGoodsUseCAS" parameterType="Goods">
    <![CDATA[
        update t_goods
        set status=#{status},name=#{name},version=version+1        where id=#{id} and version=#{version}
    ]]>
</update>
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Java解决多人同时操做的解决方案 实际例子介绍

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情