每博一文案

看过这样一句话,时间在不断的筛选你身边的人和事。当你什么都不在乎的时候,你的人生才刚刚开始。
当我们什么都不在乎时,会发现什么都可能会进行经历,但什么都一定会过去,起始都会离开的或早或晚吧了。
道德经中说:“飘风不终朝,骤雨不终日“,生活本来没有那么沉重,一味的与自己较劲,只会作茧自缚,
折磨你的从来不是任何热的情绪,而是你心存幻想的期待。
世间万物都在治愈你,但唯独你自己,不可放过自己,你涉水而过,但不代表拥有这条河,越是执着,哪些
给你带来快乐的人,事,物,其带来的痛苦就越大,不要把怀念,弄得比过程还长。
怀念时一种惩罚,惩罚哪些喜欢念旧的人。要知道钟表能回到起点,但是回不到昨天,你应该让自己变好,
而不是沉寂在,这段不闻不问的日子里,与其纠结往事,越陷越深,不如试着与它和解,别和往事过不去,因为他已经过去,别和现实过不去,因为你还要过下去,意味的偏执,往往会将自己的救赎越埋越深。
世上千灯万盏,不如心灯一盏。心若盛开,一念起风声鹤唳,一念灭繁花似锦。
大风遥遥,有人告别,有人伫立。暮色长凝,有人点灯,有人熄。花开花落自有时,别问这人间值不值得。
安然过冬,来年一定又是好春光。
愿你得失随缘,自在随心,往事的背后疗伤,在人来人往中坚强。——————   一禅心灵庙语1

文章目录

  • Java简单演示悲观锁
  • 每博一文案
  • 悲观锁
  • 总结:
  • 最后:

悲观锁

顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

在Mysql当中只需要在 select 查询的结果后面加上 for update其查询的结果就被锁上了。如果本次事务没有被 commit 提交给数据库,则其他事务就无法修改:下面我们对 tests 数据表进行一个悲观锁的控制


下面是两段Java中使用悲观锁的演示:

package Blogs.blogs04;import java.sql.*;public class LockTest {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;  // 扩大作用域,用于关闭资源try {// 1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.连接驱动中的数据库,url中的 localhost 可以省略为 ///dbtestconnection = DriverManager.getConnection("jdbc:mysql:///dbtest6","root","MySQL123");connection.setAutoCommit(false);  // 取消自动提交数据,开启事务// 3. 获取操作数据库的(预编译)对象String sql = "select id,name from tests where id = ? for update";  // for update 悲观锁preparedStatement = connection.prepareStatement(sql);  // 预编译对象// 填充占位符preparedStatement.setInt(1,1);  // 占位符的填充从起始下标 1 开始// 4.执行sql语句resultSet = preparedStatement.executeQuery();// 处理select 查询的结果集while(resultSet.next()) {  // 判断该行记录是否有数据有,返回true并向下移动,没有返回falseint id = resultSet.getInt(1);String name = resultSet.getString(2);System.out.println(id+"=>"+name);}connection.commit();  // 手动提交数据信息} catch (Exception e) {if(connection != null) {// 出现异常,回滚事务try{connection.rollback();  // 事务的回滚} catch(SQLException E) {throw new RuntimeException (E);  // 将编译异常转换为运行异常抛出}}throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出} finally {// 6.关闭资源,最晚使用的最先关闭if(resultSet != null) {  // 防止空引用try{resultSet.close();   // 释放处理select 查询结果集的资源}catch(SQLException e) {throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出}}if(preparedStatement != null) {try{preparedStatement.close();  // 释放操作数据库的资源} catch (SQLException e) {throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出}}if(connection != null) {try {connection.close();  // 关闭数据库连接} catch (SQLException e) {throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出}}}}
}
package Blogs.blogs04;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class LockTest2 {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null; // 扩大作用域,用于关闭资源try {// 1. 注册驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2.连接驱动上的数据库connection = DriverManager.getConnection("jdbc:mysql:///dbtest6","root","MySQL123");connection.setAutoCommit(false); // 取消自动提交数据,开启事务// 3. 获取到操作数据库的对象(预编译sql语句对象)String sql = "update tests set name = ? where id = ?";  // 占位符不要加单引号,不然就成字符串了preparedStatement = connection.prepareStatement(sql);  // 仅仅只是预编译sql语句// 填充占位符(在预编译之后,防止sql注入),起始下标是从 1 开始的preparedStatement.setString(1,"Tom");preparedStatement.setInt(2,1);// 4.执行sql语句int count = preparedStatement.executeUpdate(); // 返回影响数据库的行数(注意是无参的,因为上面我们已经编译过了)System.out.println("影响数据库的行数: "+count);connection.commit();  // 手动提交数据// 5. 处理select 查询的结果集,这里不是} catch (Exception e) {// 发生异常,回滚事务if(connection != null) {  // 防止null引用try {connection.rollback();} catch (SQLException E) {throw new RuntimeException (E);  // 将编译异常转换为运行异常抛出}}throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出} finally {// 6.关闭资源,最晚使用的最先关闭资源if(preparedStatement != null) {try{preparedStatement.close();  // 释放操作数据库的资源} catch (SQLException e) {throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出}}if(connection != null) {try {connection.close();  // 关闭数据库连接} catch (SQLException e) {throw new RuntimeException (e);  // 将编译异常转换为运行异常抛出}}}}
}

总结:

悲观锁:如果一个 select 查询的结果集附加上 for update (就会被悲观锁,锁住),当这个事务没有手动提交 commit 数据结束,其他事务是无法对 select 查询结果集锁住的数据进行一个修改的,但只有悲观锁的事务 commit 提交了,就可以更改了。

最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!。最后,朋友,请留下你来过的证明 。

Java简单演示悲观锁相关推荐

  1. **Java有哪些悲观锁的实现_阿里秋招Java研发工程师岗:来自校友的面试还原(已拿Offer)...

    前言 本篇题材来自我的校友投稿,他在最近的秋招校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由面试本人--小林提供(译名) 由于作者面试过程中高度紧张,本文中只列出了自己还记得的部分题目. ...

  2. java里面的悲观锁和乐观锁

    最近面试,面试官提到了悲观锁和乐观锁,感觉回答的不是很好,特此总结记录. 简单来说,悲观锁就是凡事都认为会出现最坏的情形,而乐观锁就是认为凡事都以最好的情形发展,对应一个消极,一个积极. 悲观锁 具有 ...

  3. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  4. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  5. 聊一聊Java中的悲观锁和乐观锁

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 文章目录 悲观锁(Pessimistic Locking) 悲观锁存的问题: 乐观锁 乐观锁存在的问 ...

  6. **Java有哪些悲观锁的实现_淘宝Java研发面试:Redis+Mybatis+高并发+线程池

    在面试的这件事上,我做了大量的"功课",首先我研究了几乎所有大厂的面试题,还和负责招聘工作的几个朋友,详细的探讨了 Java 面试所要涉及的知识点 并发 简单描述下悲观锁乐观锁 J ...

  7. Java 中的悲观锁和乐观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

  8. Java编程:悲观锁、乐观锁的区别及使用场景

    定义: 悲观锁(Pessimistic Lock): 每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁.由于 ...

  9. java中的悲观锁和乐观锁

    1.悲观锁的代表是synchronized和Lock锁         ①其核心思想是:线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程,都得停下来等待         ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(六)- 逻辑控制节点
  2. PTA数据结构与算法题目集(中文)7-36
  3. RocketMQ与Kafka对比(18项差异)
  4. python实现可以被with上下文管理的类或函数
  5. trace与代码跟踪服务
  6. SQL Tree解法
  7. mqtt 获取 状态_MQTT设备接入及上报数据的命令行模拟器(Java)
  8. 输入框输入文字字符匹配
  9. hero登录器服务器列表为空,Hero引擎登陆器配置图文教程
  10. mysql能上传程序吗_利用mysql上传和执行文件
  11. 有序表,二叉排序树,二叉平衡树平均查找长度比较例题 二叉平衡树的高度
  12. Python 儒略日和公历互转代码
  13. Gentoo Linux KDE 下使用IBUS的问题
  14. BERT uncased和cased的区别
  15. java 微秒_Java中的当前时间(以微秒为单位)
  16. function函数嵌套 matlab_MATLAB嵌套函数
  17. 一个完整的URL地址包含什么
  18. 最牛人工智能 ChatGPT,进一步的应用心得和感受,提升10倍工作效率?
  19. 我给同事制定的英语学习计划
  20. 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)

热门文章

  1. 计算图替代——一种DNN框架计算图优化方法
  2. html背景图片css怎么添加,css样式怎么插入背景图片?
  3. Android开发之最新Android Studio推送代码到最新GitHub教程 | Android Studio绑定GitHub | AS令牌登录GitHub | 创建GitHub令牌
  4. CTF---Web入门第七题 猫抓老鼠
  5. 网盘修复版新增qq支付仿城通网盘115网盘源码下载
  6. 云服务器测速脚本_Linux VPS服务器带宽测速脚本:Speedtest Linux进行网络测速方法...
  7. 全球通胀对IT领域的影响
  8. 远程桌面协助的计算机名是什么意思,windows远程桌面和远程协助有什么区别
  9. 安卓开发基础知识3(国内深度摄像头方案)
  10. 摸个鱼的功夫,就学会了MySQL的DATE_FORMAT函数