有两个进程同时修改一条数据,每次加一,但有个问题,如果同时取到那个数据,就会造成一个进程的修改丢失。比如数据为5,进程1,2同时加1,结果应该为7,现在 结果为6.
框架采用SSM,在service层的处理: @Transactional(propagation = Propagation.REQUIRES_NEW)
public String getSerialNumber() {
//查询数据
List<DocSeq> docSeqs = docSeqMapper.selectDocSeq(docSeq);
//处理过后更新
updateDocSeq(docSeqs.get(0), request);
} mybatis中的查询 <select id="selectDocSeq" >
SELECT *
FROM 表名
WHERE 条件
FOR UPDATE
</select> 这样处理后并不能实现表加锁,两个进程还是会同时修改相同的值,有木有大神知道该如何去处理这个问题?
框架采用SSM,在service层的处理: @Transactional(propagation = Propagation.REQUIRES_NEW)
public String getSerialNumber() {
//查询数据
List<DocSeq> docSeqs = docSeqMapper.selectDocSeq(docSeq);
//处理过后更新
updateDocSeq(docSeqs.get(0), request);
} mybatis中的查询 <select id="selectDocSeq" >
SELECT *
FROM 表名
WHERE 条件
FOR UPDATE
</select> 这样处理后并不能实现表加锁,两个进程还是会同时修改相同的值,有木有大神知道该如何去处理这个问题?
解决方案 »
- 多条件匹配内容查询
- create secure application问题
- 分组函数遇到的问题
- 谁有关于TOAD的资料
- 请教高手这个两表相关的语句怎么写?
- SQL笔试题,第7题挂了,和公司的面试无缘。看大家能做几道(非常简单) 提供给大家希望能从中受益
- connect sys/change_on_install@testdb as sysdba 报错:insufficient priviledges ?
- 从何处入手学习ORACLE Developer?
- 紧急求救!!!----点击oracle setup 没反应
- 在线等待!如何知道update影响的行数,要求在客户端的sql里实现,不能调用服务器端存贮过程
- expdp 导出版本不兼容
- Java链接Oracle抛异常,但是用PLSQL能连上
update tt set nn=nn+1 where id=1;
语句在执行的时候才会加锁。
你用select for update道理是一样的,执行到selectDocSeq 这个id的时候才会加锁
语句在执行的时候才会加锁。
你用select for update道理是一样的,执行到selectDocSeq 这个id的时候才会加锁在处理的地方加断点或者睡眠,另开一个网页去操作数据还是会取到值,按理说在select后那条数据就加锁了,另一个网页不应该取到值得啊?这是我最疑惑的地方?是spring事务有问题吗?如果在plsql中把那条数据锁了,再用网页去操作的时候就会等在查询那,也取不到值。
语句在执行的时候才会加锁。
你用select for update道理是一样的,执行到selectDocSeq 这个id的时候才会加锁在处理的地方加断点或者睡眠,另开一个网页去操作数据还是会取到值,按理说在select后那条数据就加锁了,另一个网页不应该取到值得啊?这是我最疑惑的地方?是spring事务有问题吗?如果在plsql中把那条数据锁了,再用网页去操作的时候就会等在查询那,也取不到值。锁数据只是不让修改,并不影响查询。可以取到数据
一、允许累加
两个进程各自用增量去更新(就是#1的方式),而不是用自己增加后的结果(6)直接去覆盖数据库字段。
二、不允许累加
在条件中加上更新前的值,再取一下更新记录数(sql%rowcount),为0则表示其它进程已经修改了数据,向用户报错。
update tt set nn=6 where id=1 and nn=5;