在并发的情况下,程序事务和数据库事务是怎么运行的?

Anony_mous 发布于 2016/06/21 14:51
阅读 278
收藏 2
@Transactional  public void selectAndUpdate() {
    status = select ... for update;     if(status!="初始值") {         return;
    }
    程序逻辑 ...
    update status语句...
}

如果利用这种方式来控制并发会有什么问题?另外我还想问大家的是:多个线程的话,会不会导致当一个线程执行到程序逻辑那块的时候,资源被另一个线程 抢去的可能?导致另一个线程进入这个方法,发现状态还是没有被改变,然后又进入程序逻辑这块,导致两个线程都执行了一遍吗?数据库的一个事务没有完成的 话,会让另外一个线程的事务进入吗?

加载中
0
聽雨人
聽雨人
mysql吗?

第一个,访问量大不大,大的话,卒
第二个,数据库事务级别是哪个,我都是闭着眼睛用可重复读级别的
第三个,写入和读取是一个数据库吗,尤其是在开启读写分离的情况下,需要确认下。

聽雨人
聽雨人
回复 @Anony_mous : 事务没有结束前,数据行是被锁住的。
A
Anony_mous
回复 @聽雨人 : 多个线程的话,会不会导致当一个线程执行到程序逻辑那块的时候,资源被另一个线程抢去的可能?导致另一个线程进入这个方法,发现状态还是没有被改变,然后又进入程序逻辑这块,不会导致两个线程都执行了一遍吗?
聽雨人
聽雨人
回复 @Anony_mous :首先, 如果select for update是发往写库的话,可以锁住。其次,事务里面所有的sql查询无论读写都应该发往写库。最后,事务级别你需要了解,确保数据的一致性和完整性。
A
Anony_mous
是MySQL数据库. 1.访问量算是一般吧; 2.读写是分离的; 我见到程序里都是这样的,我觉得这样做能不能锁住都是一个问题,但是我不还有其它什么办法.....
0
就是个精虫上脑的地方
就是个精虫上脑的地方
更新语句带上状态不行? 没咋用过mysql ,oracle我都是这么干
0
zheng_pat
zheng_pat
不会,因为链接是ThreadLocal里面的,不会被其他的抢到。第二最好别用悲观锁,换乐观锁
返回顶部
顶部