精华内容
下载资源
问答
  • select * from t for updatenowait 不等待行锁释放,提示冲突,不返回结果select * from t for update wait 5等待5秒,若行锁仍未释放,则提示冲突,不返回结果s...

    http://www.cnblogs.com/xiyubaby/p/4623516.html

    select * from t for update会等待行锁释放之后,返回查询结果。select * from t for updatenowait 不等待行锁释放,提示锁冲突,不返回结果select * from t for update wait 5等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果select * from t for updateskip locked 查询返回查询结果,但忽略有行锁的记录SELECT...FOR UPDATE语句的语法如下:SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];

    其中:OF子句用于指定即将更新的列,即锁定行上的特定列。

    WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

    “使用FORUPDATEWAIT”子句的优点如下:

    1防止无限期地等待被锁定的行;

    2允许应用程序中对锁的等待时间进行更多的控制。

    3对于交互式应用程序非常有用,因为这些用户不能等待不确定4若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

    分成两类:加锁范围子句和加锁行为子句

    加锁范围子句:

    在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁

    加锁行为子句:

    当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

    在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

    For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。

    那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

    如何解锁:

    http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537496.html

    java代码行级锁

    @Override

    @Transactional(rollbackFor= Exception.class)public void update(String params) {synchronized (this) {xxxDao.updatexxx(params);}}

    展开全文
  • packagecom.robert.Redis...importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Calendar;importjava.util.concurrent.TimeUnit;pub...

    packagecom.robert.RedisTest;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Calendar;importjava.util.concurrent.TimeUnit;public classJDBCTest {private static String jdbcUrl = "jdbc:mysql://localhost:3306/test";private static String username = "test";private static String password = "test";public static voidmain(String[] args) {new Thread(newRunnable(){public voidrun(){try{

    Class.forName("com.mysql.jdbc.Driver");

    Connection connection= DriverManager.getConnection("jdbcUrl","username","password");

    connection.setAutoCommit(false);

    Statement st=connection.createStatement();

    System.out.println("Thread 1 before"+Calendar.getInstance().getTime());

    st.executeQuery("select * from table_name where id=63 for update");

    TimeUnit.SECONDS.sleep(5);

    connection.commit();

    System.out.println("Thread 1 after "+Calendar.getInstance().getTime());

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }catch(SQLException e) {

    e.printStackTrace();

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }).start();new Thread(newRunnable(){public voidrun(){try{

    Class.forName("com.mysql.jdbc.Driver");

    Connection connection= DriverManager.getConnection("jdbcUrl","username","password");

    connection.setAutoCommit(false);

    Statement st=connection.createStatement();

    System.out.println("Thread 2 before"+Calendar.getInstance().getTime());

    st.executeQuery("select * from table_name where id=63 for update");

    TimeUnit.SECONDS.sleep(10);

    connection.commit();

    System.out.println("Thread 2 after"+Calendar.getInstance().getTime());

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }catch(SQLException e) {

    e.printStackTrace();

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }).start();

    }

    }

    展开全文
  • 因此做了一个关于mysql数据库行级锁的例子做测试 package com.robert.RedisTest; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import ja...

    项目上一个业务需要对某条数据库记录加锁,使用的是mysql数据库

    因此做了一个关于mysql数据库行级锁的例子做测试

     

    package com.robert.RedisTest;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Calendar;
    import java.util.concurrent.TimeUnit;
    
    public class JDBCTest {
        
        private static String jdbcUrl = "jdbc:mysql://localhost:3306/test";
        private static String username = "test";
        private static String password = "test";
        
        public static void main(String[] args) {
            
                new Thread(new Runnable(){
                    public void run(){                    
                        try {
                            Class.forName("com.mysql.jdbc.Driver");
                            Connection connection = DriverManager.getConnection("jdbcUrl","username","password");
                            connection.setAutoCommit(false);
                            Statement st = connection.createStatement();
                            System.out.println("Thread 1 before"+ Calendar.getInstance().getTime());
                            st.executeQuery("select * from table_name where id=63 for update");
                            TimeUnit.SECONDS.sleep(5);
                            connection.commit();
                            System.out.println("Thread 1 after "+Calendar.getInstance().getTime());
                            
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
                
                new Thread(new Runnable(){
                    public void run(){                    
                        try {
                            Class.forName("com.mysql.jdbc.Driver");
                            Connection connection = DriverManager.getConnection("jdbcUrl","username","password");
                            connection.setAutoCommit(false);
                            Statement st = connection.createStatement();
                            System.out.println("Thread 2 before"+Calendar.getInstance().getTime());
                            st.executeQuery("select * from table_name where id=63 for update");
                            TimeUnit.SECONDS.sleep(10);
                            connection.commit();
                            System.out.println("Thread 2 after"+Calendar.getInstance().getTime());
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        } catch (SQLException e) {
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
        }
    }

    刚开始测试的时候发现行级锁未生效

    涉及到一下几个方面:

    首先要使用connection.setAutoCommit(false);开启事务,执行结束关闭事务即connection.commit();

    其次,通过 TimeUnit.Second.sleep(5); 设置当前线程sleep一定的时间

    执行结果如下:

    Thread 2 beforeThu Sep 01 15:50:50 CST 2016
    Thread 1 beforeThu Sep 01 15:50:50 CST 2016
    Thread 1 after Thu Sep 01 15:50:55 CST 2016
    Thread 2 afterThu Sep 01 15:51:05 CST 2016

    thread 1 先获得行级锁执行结束 
    thread 2 在 Thread 1执行结束后然后执行从开始到结束一共花了15s

    参考资料 http://www.cnblogs.com/jukan/p/5670950.html

     

    转载于:https://www.cnblogs.com/mengjianzhou/p/5830211.html

    展开全文
  • packagecom.robert.Redis...importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Calendar;importjava.util.concurrent.TimeUnit;pub...

    packagecom.robert.RedisTest;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Calendar;importjava.util.concurrent.TimeUnit;public classJDBCCountLockTest {private static String jdbcUrl = "jdbc:mysql://localhost:3306/test";private static String username = "test";private static String password = "test";public static voidmain(String[] args) {new Thread(newRunnable(){public voidrun(){try{

    Class.forName("com.mysql.jdbc.Driver");

    Connection connection=DriverManager.getConnection(jdbcUrl,username,password);

    connection.setAutoCommit(false);

    Statement st=connection.createStatement();

    st.executeQuery("select count(1) num from table_name where mobile_phone = '13651969037' and rule_id='39' for update");

    TimeUnit.SECONDS.sleep(5);

    connection.commit();

    System.out.println("Thread 1 commit "+Calendar.getInstance().getTime());

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }catch(SQLException e) {

    e.printStackTrace();

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }).start();new Thread(newRunnable(){public voidrun(){try{

    Class.forName("com.mysql.jdbc.Driver");

    Connection connection=DriverManager.getConnection(jdbcUrl,username,password);

    connection.setAutoCommit(false);

    Statement st=connection.createStatement();

    TimeUnit.SECONDS.sleep(1);

    st.executeQuery("select * from table_name where id=4139 for update");

    System.out.println("Thread 2 executeQuery finish "+Calendar.getInstance().getTime());

    String update_sql_1= "update table_name set rule_id='40' where id = '4139'";

    st.executeUpdate(update_sql_1);

    System.out.println("Thread 2 executeUpdate finish "+Calendar.getInstance().getTime());

    connection.commit();

    }catch(ClassNotFoundException e) {

    e.printStackTrace();

    }catch(SQLException e) {

    e.printStackTrace();

    e.printStackTrace();

    }catch(InterruptedException e) {

    e.printStackTrace();

    }

    }

    }).start();

    }

    }

    展开全文
  • 项目上的另外一个需求是: 在做统计的时候需要将当前表锁定不能更新当前表记录 ...import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;...
  • 数据库采用封锁技术保证并发操作的可串行性。 以Oracle为例: Oracle的分为两大类:数据(也称DML)和字典。 字典是Oracle DBMS内部用于对字典表的封锁。 字典包括语法分析和...
  • 数据库采用封锁技术保证并发操作的可串行性。以Oracle为例:Oracle的分为两大类:数据(也称DML)和字典。字典是Oracle DBMS内部用于对字典表的封锁。字典包括语法分析和DDL,由DBMS在必要的时候自动...
  • 数据库采用封锁技术保证并发操作的可串行性。 以Oracle为例: Oracle的分为两大类:数据(也称DML)和字典。 字典是Oracle DBMS内部用于对字典表的封锁。 字典包括语法分析和DDL,由DBMS在必要...
  • 数据库锁的了解,往往也是区分Java程序员中高级的一个重要标志。日常开发中,也是我们容易踩坑的地方。尤其当你的系统遇到高并发大访问量操作数据库时,稍有不慎可能造成线上事故。因此,掌握好机制的重要性...
  • java实现mysql行级锁

    2020-05-20 00:22:53
    1.mysql中的行级锁是由以下sql语句产生: select * from job_info where id = 1 for update; 主要加上了for update,其中id为主键。 如果查询条件不是主键,则会成为表锁。 2.悲观锁和乐观锁 悲观锁虽然能保证数据...
  • 课程总计41课时,从什么是事务讲起,直到分布式...实战讲数据库事务的6中并发异常:回滚丢失、覆盖丢失、脏读、幻读、不可重复读彻底搞清楚4种事务隔离级别:READ_UNCOMMITTED 读未提交隔离级别、READ_COMMITTED ...
  • mysql行级锁 java 实现

    千次阅读 2019-06-27 21:04:05
    mysql行级锁数据库引擎: InnerDB,其他的不支持行锁 所在方法要加上事务注解, 必须加上: @Transactional(isolation = Isolation.READ_COMMITTED) 查询sql举例: select * from global_lock where ...
  • 锁分类①、按操作划分:DML锁,DDL锁②、按锁的粒度划分:表级锁、行级锁、页级锁③、按锁级别划分:共享锁、排他锁④、按加锁方式划分:自动锁、显示锁⑤、按使用方式划分:乐观锁、悲观锁乐观锁和悲观锁乐观并发...
  • java的主要两种加锁机制 synchronized 关键字java.util.concurrent.Lock (Lock是一个接口,ReentrantLock是该接口一个很常用的实现) 这两种机制的底层原理存在一定的差别,synchronized 关键字通过一对字节码...
  • 首先介绍下如何判断数据库是否有锁,来看一个视图:v$locktype:TM 表锁 或者DMLTX 行锁 事务lmode:会话保持的模式0 = none1 = null2 = Row-S(SS 行级共享 ,只能查询这些对象)3 = Row-X(行级排他,在提交...
  • 乐观适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观。在Javajava.util.concurrent.atomic包下面的原子变量类就是使用了乐观的一种实现方式CAS...
  • 数据库数据库锁的分类:按锁的粒度划分:表级锁,行级锁,页级锁(BDB引擎,页级,表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。)按锁的级别划分:共享锁、排他锁...
  • 之前在对数据库加密的需求中遇到一些坑,拿出来分享一下。加密的方案是:将数据使用AES加密再经过base64编码。最近整理了一些Java架构学习视频和大厂项目底层知识点,需要的同学欢迎私信我【Java】发给你~坑一: AES...
  • JDBC-Java数据库连接

    2020-08-16 23:50:28
    JDBC1、JDBC是什么?2、JDBC的本质?3、JDBC开发前的准备工作: 先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中4、JDBC...  Java DataBase Connectivity(Java数据库连接) 2、JDBC的本质? JDBC
  • Java 数据库 面试必备

    2021-04-14 14:21:12
    innoDB: 支持 事务,外键 等 行级锁 占用空间大,不支持全文索引 MyISAM 是非事务的存储引擎,适合用于频繁查询的应用。 表锁,不会出现死锁,适合小数据,小并发。 innoDB是支持事务的存储引擎,合于插入和更新...
  • ​ 总是假设最坏的情况,每次去...传统的关系型数据库里边就用到了很多这种机制,比如行锁,表锁等,读,写等,都是在做操作之前先上Java中synchronized和ReentrantLock等独占就是悲观思想的实现。 ​
  • mysql 行级锁的使用

    千次阅读 2017-11-17 17:45:27
    先上测试代码,使用jdbc连接,... 数据库连接,或一个单独的事务 package com.hacker.jdbc.transactional; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import jav
  • 数据库数据库锁的分类:按锁的粒度划分:表级锁,行级锁,页级锁(BDB引擎,页级,表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。)按锁的级别划分:共享锁、排他...
  • JDBCTest10.java(该文件模拟读取数据库表信息) 1 package com.neu.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java...
  • 转自:https://www.cnblogs.com/boblogsbo/p/5602122.htmlmysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。共享锁又称为读锁,简称S锁,顾名思义,共享锁...
  • 答:MyISAM默认用的是表级锁,不支持行级锁; InnoDB默认用的是行级锁,也支持表级锁 举例: person_info_myisam是MyISAM引擎; person_info_large是InnoDB引擎 两张表的字段相同 MyISAM默认用的是...
  • java锁与分布式

    2018-02-10 16:06:44
    语法关键字的锁synchronizeRetrantLockReadWriteLock,独占锁,共享锁分布式锁,zookeeper中的锁,redis setnx锁,redLock锁数据库锁,独占锁,共享锁行级锁begin; select * from table where id=1 for update;//id...
  • MySQL 默认InnoDB引擎和默认为行级锁行级锁又包括共享锁与排它锁。 具体概念不多说,百度一堆。重点直接看实际场景应用 应用场景应用与分析(重点) 高并发下,多个用户修改同一条数据。 举例...
  • java面试之mysql数据库

    2019-02-22 17:08:48
    Innodb引擎提供了对数据库ACID事务支持,并实现四种隔离级别和行级锁和外键约束,MyISAM没有提供对数据库事务的支持,也不支持行级锁和外键,但它存储了表的行数,统计的时候不需要进行全表扫描,所以如果读操作远...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

java数据库行级锁

java 订阅