Java解决多人同时操做的解决方案 实际例子介绍
原文
简介
最近公司在作团购这块的一个商品的促销活动,在建立促销的时候发现只能有一个用户进行修改和编辑,若是其余用户操做同一个促销活动就会出现数据不一致,这也就是咱们常常遇到的多人同时操做的问题,下面我将详细介绍关于这块咱们的解决方案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>
0条评论