2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > mysql 查询死锁 Java如何实现对Mysql数据库的行锁 – 数据库 – 前端 sql语句

mysql 查询死锁 Java如何实现对Mysql数据库的行锁 – 数据库 – 前端 sql语句

时间:2021-05-13 21:04:08

相关推荐

mysql 查询死锁 Java如何实现对Mysql数据库的行锁 – 数据库 – 前端 sql语句

行锁

mysql实现行级锁的两大前提就是,innodb引擎并且开启事务。由于MySQL/InnoDB的加锁分析,一般日常中使用方式为: select …. from table where ….. for update 语句并且在 Repeatable Read 事务隔离级别下。

行锁的劣势:开销大;加锁慢;会出现死锁

行锁的优势:锁的粒度小,发生锁冲突的概率低;处理并发的能力强

加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁;当然大家也可以显示的加锁:

共享锁:select * from table where “条件” + lock in share more

排他锁:select * from table where ”条件“ + for update

MySQL 事务属性

事务是由一组SQL语句组成的逻辑处理单元,事务具有ACID属性。

原子性(Atomicity):事务是一个原子操作单元。在当时原子是不可分割的最小元素,其对数据的修改,要么全部成功,要么全部都不成功。一致性(Consistent):事务开始到结束的时间段内,数据都必须保持一致状态。隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的”独立”环境执行。持久性(Durable):事务完成后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。举例说明

innodb引擎中行级锁分为以下三种锁

1.Record Lock

单个行记录上的锁

2.Gap Lock

间隙锁,锁定一个范围,不包括记录本身

3.Next-Key Lock

锁定一个范围和记录本身

话不多说直接代码开干

代码:select * from table where order_no= ‘xxx’ for update;

order_no是主键的时候,可以确定唯一一条数据, 所以在此加上Record Lock(即为单个记录上锁)

order_no是普通索引的时候,innodb层面 会根据条件锁定一个范围,在查询的时候聚簇索引上加Record Lock(即为单个记录上锁)

order_no不是索引的时候,本条sql会进行全表扫描,会在所有的聚簇索引上加锁,相当于全表锁,这个是在mysql innodb引擎层面决定。

还有一种情况,假如后面跟多个情况

代码:select * from table where order_no= ‘’ and code=’xxx’ for update;

经过上面分析

order_no主键,code不是索引,查询都只有一条数据,加Record Lock

order_no 普通索引,code不是索引 ,会先扫描order_no= ‘’,范围下加锁

结论:大家的for update 并不时都锁一条记录,也并不是只有一个锁,但是也包含大家常用的手段了,在项目中可以实践用用哦

好了,如果对您有帮助,记得关注收藏转发哦,偶会一直在这里等候与您交流

mysql 查询死锁 Java如何实现对Mysql数据库的行锁 – 数据库 – 前端 sql语句修改mysql数据库密码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。