java - 在并发的情况下,程序事务和数据库事务是怎么运行的?
高洛峰
高洛峰 2017-04-18 09:17:48
0
3
275
@Transactional
public void selectAndUpdate() {
    status = select ... for update;
    if(status!="初始值") {
        return;
    }
    
    //逻辑开始
    程序逻辑 ...
    举例:用户支付
    1.生成用户签名
    2.发起用户支付到第三方
    //逻辑结束
    
    update status语句...
}

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
小葫芦

for update의 단점 @Hisoka는 이미 다른 스레드를 차단하는 것 외에도 잠금 프로세스가 데이터베이스에 막대한 성능 손실을 초래한다고 말했습니다. for update 따라서 문제 해결을 위해 낙관적 잠금을 사용하는 것이 좋습니다. 프로그램 논리가 메모리에서 작동하고 원본 데이터를 포함하지 않으므로 낙관적 잠금을 사용하여
문에서 상태를 제어하기만 하면 됩니다. ... 여기 update status

迷茫

이 방법은 동시성 제어를 달성하기 위해 비관적 잠금을 사용합니다. 또한, nowait가 없는 업데이트의 경우 잠금을 추가한 후 스레드가 빠르게 실패하게 됩니다. 또한 트랜잭션에는 격리 수준과 전파 동작 구성이 다르므로 자세한 내용은 정보를 찾아보는 것이 좋습니다.

Ty80

for update는 높은 동시성 시나리오 문제를 해결하는 데 사용되며 분산 잠금 메커니즘을 사용하여 구현됩니다. 첫 번째 for update 문이 실행되면 후속 SQL 문은 다음 문을 실행하기 위해 돌아가기 전에 첫 번째 SQL 문 커밋이 성공적으로 실행되고 제출될 때까지 대기하고 대기합니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿