ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【JDBC】笔记(5)--- 悲观锁和乐观锁的概念;演示行级锁机制

2022-01-03 14:33:01  阅读:240  来源: 互联网

标签:行级 JDBC abc ps resultSet --- connection loginName null


1.悲观锁和乐观锁的概念:


2.演示行级锁机制:

注意:DBUtil类 为博主之前自己写的类:【JDBC】编程(2)--- 写一个JDBC工具类;用 JDBC工具类 实现模糊查询

 

/*

演示行级锁机制

此程序先开启事务,并使用行级锁锁住“loginName = abc”的那条记录

*/

 

import java.sql.*;

public class JDBCLock01 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet resultSet = null;

        try {
            connection = DBUtil.getConnection();

            connection.setAutoCommit(false);

            //锁住“loginName = abc”的这条记录
            String sql = "select loginName,loginPwd from t_user where loginName = ? for update";
            ps = connection.prepareStatement(sql);
            ps.setString(1,"abc");

            resultSet = ps.executeQuery();

            while (resultSet.next()){
                System.out.println("loginName = "+resultSet.getString("loginName")+
                        ",loginPwd = "+resultSet.getString("loginPwd"));
            }

            //添加断点,让此事务在此暂停10s后结束
            Thread.sleep(10000);//使当前线程暂停10000毫秒

            connection.commit();
        } catch (Exception e) {
            if (connection != null) {
                try {
                    connection.commit();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,ps,resultSet);
        }

    }
}

 

"JDBCLock01"控制台情况:

(暂停大约1000毫秒然后输出:)

loginName = abc,loginPwd = 123

Process finished with exit code 0

 


/*

演示行级锁机制

此程序后开启事务,负责修改被锁定的记录

*/

 

import java.sql.*;

public class JDBCLock02 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement ps = null;

        try {
            connection = DBUtil.getConnection();

            connection.setAutoCommit(false);

            //修改“loginName = abc”的这条记录的密码
            String sql = "update t_user set loginPwd  = ? where loginName = ?";
            ps = connection.prepareStatement(sql);
            ps.setString(1,"888");
            ps.setString(2,"abc");

            int count = ps.executeUpdate();

            System.out.println("更新数据"+count+"条");

            connection.commit();
        } catch (SQLException e) {
            if (connection != null) {
                try {
                    connection.commit();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,ps,null);
        }

    }
}

 

"JDBCLock02"控制台输出结果:

("JDBCLock01"程序结束后输出)

更新数据1条

Process finished with exit code 0

 

总结:在当前事务中,用行级锁锁住的记录,那么在此事务结束之前,其他事务将无法对“锁住的记录”进行操作(update/delete),但是select可以。

 

标签:行级,JDBC,abc,ps,resultSet,---,connection,loginName,null
来源: https://www.cnblogs.com/Burning-youth/p/15759459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有