Tag Archives: Mysql

Mysql的行锁只锁一行记录吗?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。 InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,会把所有扫描过的行都锁定! 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。 由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁; 另外间隙锁也会锁多行,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁! 当发生死锁的时候,Innodb目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。 查看INNODB中可能存在的死锁情况: SHOW ENGINE INNODB STATUS

在Mysql中模拟ROW_NUMBER, RANK, DENSE_RANK

从MariaDB 10.2.0版本,开始支持window类函数,但现在还不是正式版本,不建议在生产环境使用。 可以使用下面的sql语句,模拟ROW_NUMBER, RANK, DENSE_RANK函数的功能。这种写法不需要做表的自连接,性能会比较好。