关于用select-for-update语句产生锁住记录不让其他事务(线程)修改的问题

本文探讨了在Java应用中使用`@Transactional`注解和`SELECT FOR UPDATE`语句来实现行级锁的效果。通过示例代码展示了如何在不同情况下控制事务的提交时机,以确保数据在长时间操作过程中的锁定。实验结果显示,`selectForUpdate`方法需加上`@Transactional`以维持锁的状态,防止其他事务在更新时冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

我们知道update库表里的一条数据会产生行锁(以mysql innodb为例),提交事务后才会释放行锁,在行锁阶段别的事务无法去修改同一条记录。

在 Navicat 和命令行中,执行完这条update的 SQL 就立即提交事务。但是在Java程序里,用 @Transactional 修饰的方法只有执行完毕后才会提交事务。

除了update 语句,select for update 语句也是可以产生行锁的(也不一定是行锁,也可能表锁),可以用于临时锁定一行记录不被修改。

今天研究的课题就是研究下 select for update 的细节

代码

直接上代码

  • Rest 接口
@RestController
public class TestRest {
   
    @Autowired
    @Qualifier("testService1Impl")
    private TestService testService1;
    @Autowired
    @Qualifier("testService2Impl")
    private TestService testService2;
    @Autowired
    @Qualifier("testService3Impl")
    private TestService testService3;
    @Autowired
    @Qualifier("testService4Impl")
    private TestService testService4;

    @GetMapping("/testSelectForUpdate1")
    public Object testSelectForUpdate1(@RequestParam Integer id) {
   
        return testService1.selectForUpdate(id);
    }
    @GetMapping("/update1")
    public String update1(@RequestParam Integer id) {
   
        String remark = new SimpleDateFormat("HH:mm:ss.SSS").format(new Date());
        return "affected:" + testService1.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值