专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

Java如何实现对Mysql数据库的行锁_数据库

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/3/5 20:39:37       共计:3591 浏览
Java如何实现对Mysql数据库的行锁?

在讲锁之前,首先讲讲两个概念吧 ,嘿嘿 行锁和MySQL 事务属性

行锁

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= '20200521xxx' for update;

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

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

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

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

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

经过上面分析

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

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

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

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

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:cmd如何进入jdbc_数据库 | ·下一条:mysql查询乱码问题,mysql怎么把数据库中的字符集gb2312编码改成gbk编码_数据库

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有