Java解决多⼈同时操作的解决⽅案实际例⼦介绍
简介
最近公司在做团购这块的⼀个商品的促销活动,在创建促销的时候发现只能有⼀个⽤户进⾏修改和编辑,如果其他⽤户操作同⼀个促销活动就会出现数据不⼀致,这也就是我们经常遇到的多⼈同时操作的问题,下⾯我将详细介绍关于这块我们的解决⽅案
出现数据不⼀致的现象通常分为两种:1.覆盖更新 2.脏读
关于这类问题⼀般会考虑到⽤数据库锁的机制来解决
数据库锁分为乐观锁和悲观锁
乐观锁
乐观锁并不锁住任何东西,⽽是在提交事务时检查⾃⼰上次读取这条记录后,是否有其他事务修改了这条记录,如果没有则提交,如果被修改了则回滚。如果并发的可能性并不⼤,那么锁定策略带来的性能消耗是⾮常⼩的
悲观锁
与乐观锁相⽐,悲观锁则是⼀把真正的锁了,它通过SQL语句“select for update”锁住数据,这时如果其他事务来更新时会等待,悲观锁会锁住整张表,性能较低,导致其他的事务不能访问
实例介绍
接下来对于这块我采⽤的是乐观锁的⽅案,关于实现乐观锁有三种⽅式:
1.是为数据表增加⼀个version字段,每次事务开始时,取出version,在提交事务时,检查version是否有变化
如果没有变化提交事务时将version + 1,SQL差不多是这样:
UPDATE t_promotion
set version = version + 1
where promotionid = ?
and version = ?
2.是为数据表增加⼀个时间戳字段,然后通过⽐较时间戳检查该数据是否被其他事务修改过。
3.是检查对应的字段的值有没有变化
这⾥采⽤第⼀种⽅式 ,第⼆种跟第⼀种很类似 第三种性能不⾼
总结笔记
解决多⼈同时操作问题解决⽅案:
1.采⽤数据库锁的机制
乐观锁的实现⽅案:
就是在提交事务时检查⾃⼰上次读取这条记录后,是否有其他事务修改了这条记录,如果没有则提交,如果被修改了则回滚
⼀般有三种⽅式实现乐观锁:
(1).是为数据表增加⼀个version字段,每次事务开始时,取出version,在提交事务时,检查version是否有变化
如果没有变化提交事务时将version + 1,SQL差不多是这样:
UPDATE T_IRS_RESOURCE
set version = version + 1
where resource_id = ?
and version = ?
(2).是为数据表增加⼀个时间戳字段,然后通过⽐较时间戳检查该数据是否被其他事务修改过。
(3).是检查对应的字段的值有没有变化。
ibatis实现乐观锁解决⽅案的实现原理
使⽤数据版本(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>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。