如题,MYSQL innoDB下,所有表的主键都是自增的无实际业务意义的数字,那么要怎么使用select ... for update,才能做到是行级锁而非表级锁呢?

解决方案 »

  1.   

    补充提问:如果不用select for update,怎么解决并发的不安全问题?
      

  2.   


    mysql的innodb自动就是行级锁。当时,也有一个前提,就是你的查询条件也的有索引,否则和表级锁没区别,每一行都锁住了,就和锁住整个表一样的效果了。
      

  3.   


    不用select for update,那么select的时候 就不会加独占锁,并发情况下肯定是问题的。建议你直接在update语句和select合并到一个sql中
      

  4.   


    mysql的innodb自动就是行级锁。当时,也有一个前提,就是你的查询条件也的有索引,否则和表级锁没区别,每一行都锁住了,就和锁住整个表一样的效果了。问题是我看到说,如果select for update语句中查询条件没有主键,就会是表级锁。然而主键是无意义的自增数字呀,一般不会出现在查询条件里
      

  5.   

    select for update,有WHERE条件吧,WHERE条件的字段应该 有索引吧,FOR UPDATE加的是X锁,是可以行锁的,别的读不了,事务结束后,马上提交或回滚
      

  6.   


    mysql的innodb自动就是行级锁。当时,也有一个前提,就是你的查询条件也的有索引,否则和表级锁没区别,每一行都锁住了,就和锁住整个表一样的效果了。问题是我看到说,如果select for update语句中查询条件没有主键,就会是表级锁。然而主键是无意义的自增数字呀,一般不会出现在查询条件里实际上并没有锁表。我做了实验,在查询条件中不包含主键后者索引时,我启用另一个回话还是可以update数据的,所以这一点证明并没有锁住整个表。