java mysql 行锁_Java如何实现对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 并不时都锁一条记录,也并不是只有一个锁,但是也包含我们常用的手段了,在项目中可以实践用用哦
java mysql 行锁_Java如何实现对Mysql数据库的行锁?相关推荐
- java access远程连接_Java程序实现对access数据库的远程访问
第四步:在其它计算机中运行测试代码 1. 程序中需要数据提供驱动程序,如: Class.forName("org.objectweb.rmijdbc.Driver").newIn ...
- 实现对mysql增删改查_Java语言实现对MySql数据库中数据的增删改查操作的代码
简单说操作的步骤: 1.连接数据库 2.将SQL语句发送到数据库 3.执行SQL语句 这里举个例子: 在一个数据库中有个students表,表中有学号(Id),姓名(Name),性别(Sex),地址( ...
- koa2 mysql增删改查_koa2实现对mysql的增删改查函数封装
// 项目开始先造一个简单的node服务器server.js: const Koa = require('koa'); const Path= require('path'); const Stati ...
- mysql 删除数据 分页_PHP实现对mysql数据库内容分页显示
在写列表页读数据的时候往往要写上一个分页代码,小编研究了很久,也搜索了很多东西,最后总结出了以下分页代码,有需要的朋友可以研究研究 /**********分页开始**********/ $pageSi ...
- Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用
Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用 前言 做DBA,最基本的工作就是需要管理公司的数据库系统.工作中,常常需要维护的数据库数量是非常多的.小 ...
- 超详细的hibernate实现对MySQL的CRUD
超详细的hibernate实现对MySQL的CRUD 文章目录 超详细的hibernate实现对MySQL的CRUD 前言 一.操作前的准备 1.创建maven项目 2.导入maven依赖 3.创建实 ...
- maven mybatis mysql_Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问...
标签: 本篇内容还是建立在上一篇Java Web学习系列--Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Ja ...
- 通过servlet来实现对Mysql进行连接、插入、修改、删除操作
通过servlet来实现对Mysql进行连接.插入.修改.删除操作 来自:http://blog.sina.com.cn/s/blog_4bea2fb10100f3w3.html package Se ...
- 【五一创作】使用Scala二次开发Spark3.3.0实现对MySQL的upsert操作
使用Scala二次开发Spark实现对MySQL的upsert操作 背景 在我们的数仓升级项目中,遇到了这样的场景:古人开发的任务是使用DataStage运算后,按照主键[或者多个字段拼接的唯一键]来 ...
最新文章
- 如何在Mac OSX Yosemite中将Ruby版本2.0.0更新到最新版本?
- 搜索不包含关键词_sem竞价代运营丨做竞价推广,关键词匹配才是重点
- 【OpenGL】五、Visual Studio 2019 配置 GitHub ( 提交代码 )
- 又是一卦测感情,这卦很是霸气
- Java中使用MATLAB作图
- PHP多线程的实现(PHP多线程类)
- android toolbar源码解析,深入理解Android 5.0中的Toolbar
- 鸿蒙太空是什么意思,[评论]林黛玉:“眼泪还债”暗洒闲抛知为谁?
- android高德地图关键字搜索,关键字搜索-POI搜索-示例中心-JS API 示例 | 高德地图API...
- MacBook常用快捷键
- 老男孩MySqI DBA周末班(三期)
- XUL 用户界面语言介绍
- 肠道微生物群与心血管疾病:机遇与挑战
- 深圳和广州的培训机构名单(不定期更新)
- JAVA-Swing技术
- Plants vs. Zombies(二分)
- 2023年河北医科大学临床检验诊断学考研分享
- LiveNVR直播拉流转码无插件直播流媒体服务如何配置视频流水印视频上面添加水印
- 光盘加密软件测试自学,SecurDisc光盘加密功能实战
- 恒生电子2023年实习春招笔试第二题(编程)