Pessimistic Locking ——悲观锁

2024-08-26 13:32
文章标签 悲观 locking pessimistic

本文主要是介绍Pessimistic Locking ——悲观锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      在上一篇博客中说到Java中的synchronized关键字,它在处理高并发的时候对代码加了锁,但是并不能保证数据的一致性。这个时候我们可以用悲观锁。


    悲观锁,正如其名,悲观!以为别人一上来就要修改数据库,所以它就从别人一上来的时候对数据加锁了!它具有强烈的独占和排他特性,对于外界的修改持一种保守的态度,所以每次拿数据的时候都会上锁,也就是在操作之前上锁。


示例:


<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">public static  int generate(String tableName){//使用数据库的悲观锁for updateString sql = "select value from t_table_id where table_name=? for update";Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;int value = 0;try{conn = DbUtil.getConnection();//执行事务DbUtil.beginTransaction(conn);pstmt = conn.prepareStatement(sql);pstmt.setString(1,tableName);rs = pstmt.executeQuery();if (!rs.next()){throw new RuntimeException();}value = rs.getInt("value");value++;//自加modifyValueField(conn, tableName,value);//提交事务DbUtil.commitTransactin(conn);}catch(Exception e){e.printStackTrace();//回滚事务DbUtil.rollbackTransaction(conn);throw new RuntimeException();}finally{DbUtil.close(rs);DbUtil.close(pstmt);DbUtil.resetConnection(conn);//重置Connection的状态DbUtil.close(conn);}return value;}</span></span>


<span style="font-family:KaiTi_GB2312;font-size:24px;">	public static void beginTransaction(Connection conn){//开始事务try {if (conn !=null){if (conn.getAutoCommit()){conn.setAutoCommit(false);//手动提交}}}catch(SQLException e){}}public static void commitTransactin(Connection conn){//提交事务try{if(conn !=null){if(!conn.getAutoCommit()){conn.commit();}}}catch(SQLException e){}}public static void rollbackTransaction(Connection conn){//事物回滚try{if (conn !=null){if (conn.getAutoCommit()){conn.setAutoCommit(false);}else{conn.setAutoCommit(true);}}}catch(SQLException e){}}public static void resetConnection(Connection conn){//事物重置try{if(conn != null){if(conn.getAutoCommit()){conn.setAutoCommit(false);}else{conn.setAutoCommit(true);}}}catch(SQLException e){}}</span>



   悲观锁的实现,往往依靠数据库提供的锁机制,这也就说明了只有在数据库层提供的锁机制才能正真保证数据访问的排他性。


   与悲观锁相对应的是乐观锁,乐观锁以为别人上来不会修改数据,所以它是没有加锁的,只有在更新的时候才会判断别人有没有更新这个数据库。

这篇关于Pessimistic Locking ——悲观锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108696

相关文章

面试官问:说说悲观锁、乐观锁、分布式锁?都在什么场景下使用?有什么技巧?...

点击上方“朱小厮的博客”,选择“设为星标” 后台回复"书",获取 后台回复“k8s”,可领取k8s资料 如何确保一个方法,或者一块代码在高并发情况下,同一时间只能被一个线程执行,单体应用可以使用并发处理相关的 API 进行控制,但单体应用架构演变为分布式微服务架构后,跨进程的实例部署,显然就没办法通过应用层锁的机制来控制并发了。 那么锁都有哪些类型,为什么要使用锁,锁的使用场景有哪些? 锁类别

Java 入门指南:Java 并发编程 —— Synchronized 实现悲观锁(Pessimistic Locking)

悲观锁 悲观锁(Pessimistic Locking)是一种悲观的并发控制机制,它基于悲观的假设,即并发冲突会时常发生,因此在访问共享资源(如数据库记录或共享变量)之前,会先获取独占性的锁,以防止其他线程对资源的并发读写。 悲观锁适用于写操作频繁、读操作较少的场景,能够确保数据一致性,但会引入较大的性能开销和线程切换的开销。 实现方式 在 Java 中,可以使用以下方式实现悲观锁: s

MySQL 如何使用乐观锁和悲观锁

首先要说明的是:乐观锁和悲观锁并不是锁,而是锁的设计思想。 在 MySQL 中,乐观锁和悲观锁是两种用于解决数据库并发问题的机制。 悲观锁 悲观锁是指在访问数据时,认为数据会被其他事务修改,因此会采取锁定数据的方式来防止其他事务的修改。使用悲观锁时,一旦一个事务获取了锁,其他事务必须等待,直到第一个事务释放锁为止。 在 MySQL 中,悲观锁通常通过以下两种方式实现: SELECT … F

【Hibernate】Hibernate对“悲观”和“乐观”锁的支持

首先,“锁”这个东西,可以认为是一种思想,悲观锁还是乐观锁,是人定义出来的一种概念,并非理解为DBMS的专属。换个称呼,叫做“悲观并发控制”或者“乐观并发控制”更便于我们理解二者的意义。          一、概念        ----(该部分内容来源于网络:http://www.open-open.com/lib/view/open1452046967245.html

阿里巴巴发布Q1财报:电商份额趋稳,市场不再悲观

8月15日,阿里巴巴发布2025财年Q1(2024年6月底止季度)财报,显示营收2432.36亿元,净利润为240.22亿元。 在总体增收不增利的业绩报告之中,淘天的表现十分亮眼! 毫无疑问,淘天已经向市场证明:靠着低价打价格战并不是电商内卷的唯一发力点。 战略投入见效 整体而言,这一季财报显示阿里正持续加大对用户体验的投入,电商业务实现规模和市场份额的稳步

mysql 悲观锁使用

悲观锁是一种数据库锁定机制,它假设每次操作都会发生并发冲突,因此在执行任何需要读取或写入数据的操作之前,先获取锁,防止其他事务对该数据进行修改。悲观锁确保了操作的独占性,以防止数据被其他事务同时修改,从而保证数据的一致性。 悲观锁分为两种: 1、共享锁(S锁):允许多个事务同时读取数据,但不能修改数据。 2、排他锁(X锁):禁止其他事务读取或修改数据,只有获取锁的事务可以操作数据。 使用场

乐观锁和悲观锁——独占锁和共享锁

乐观锁和悲观锁:数据库的锁机制 在数据库管理系统中的并发控制是为了确保多个事务之间同时读取数据库中同一个数据时,不破坏事务的隔离性和统一性以及数据库的统一性。实现并发控制的手段大致可以分为乐观并发控制和悲观并发控制。 悲观锁:每次去拿数据的时候,都默认别人会修改这个数据,所以都会上锁,这样就会阻止其他人修改该数据,直至锁被释放。乐观锁:每次去拿数据的时候,都默认别人不会修改这个数据,所以不会上锁

高并发开发-悲观锁

高并发买火车票,会出现卖出比存货要多的情况。 悲观锁是通过数据库锁定记录操控。在搜索库存时加入for update 执行一个线程会将其他线程挂起。所以会影响性能

通过模拟银行账户取钱操作,彻底了解Java多线程中的乐观锁和悲观锁!

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

synchronized 作为悲观锁,锁住了什么?

继续来认识 synchronized,上篇文章加不加 synchronized 有什么区别?我们了解了 synchronized 是在多线程并发竞争同一资源的时候使用,这一篇我们来了解,synchronized 作为悲观锁,锁住了什么? 锁实例对象 上篇文章我们就有锁实例对象的代码样例,只是当时没有细说这个概念。我们再写一个代码来测试一下。代码逻辑是这样的:我们写 2 个 synchron