JDBC: 事务 行级锁/悲观锁

行级锁/悲观锁:某一行或多行被锁住,本事务中数据不能动,下一个事务只能排队等候上一个事务结束,再动数据。
//行级锁:在sql语句后面加for update
String sql=“select ename,job,sal from emp1 where job= ? for update”;

(1)行级锁程序

package com.jdbc;
import com.jdbc.utils.DBUtil;
import java.sql.*;
/**
 * 这个程序开启一个事务,这个事务专门进行查询,并且使用行级锁/悲观锁,锁住相关记录。
 * */
public class JDBCTest12 {
    public static void main(String[] args) {
        Connection conn =null;
        PreparedStatement ps= null;
        ResultSet rs =null;
        try {//2.获取连接+1.注册驱动(类加载时调用)
            conn= DBUtil.getConnection();
            //开启事务
            conn.setAutoCommit(false);
            //行级锁
            String sql="select ename,job,sal from emp1 where job= ? for update";
            //3.获取预编译数据库操作对象
            ps=conn.prepareStatement(sql);
            ps.setString(1,"MANAGER");
            //4.执行SQL语句
            rs=ps.executeQuery();
            //5.查询结果集
            while (rs.next()){
                System.out.println(rs.getString("ename")+","+rs.getString("job")+","+rs.getDouble("sal"));
            }
            //提交事务(事务结束)
            conn.commit();

        } catch (Exception e) {
            if(conn!=null){
                try {//回滚事务(事务结束)
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,rs);
        }
    }
}/*结果:
JONES,MANAGER,2975.0
BLAKE,MANAGER,2850.0
CLARK,MANAGER,2450.0
JONES,MANAGER,2975.0
BLAKE,MANAGER,2850.0
CLARK,MANAGER,2450.0*/

(2)这个程序负责修改被锁定的记录 JDBCTest12 行级锁

package com.jdbc;
import com.jdbc.utils.DBUtil;
import java.sql.*;
/**
 * 这个程序负责修改被锁定的记录 JDBCTest12 行级锁
 * */
public class JDBCTest13 {
    public static void main(String[] args) {
        Connection conn= null;
        PreparedStatement ps =null;
        try {
            conn= DBUtil.getConnection();
            conn.setAutoCommit(false);

            String sql="update emp1 set sal =sal * 1.1 where job =?";
            ps=conn.prepareStatement(sql);
            ps.setString(1,"MANAGER");
            int count = ps.executeUpdate();
            System.out.println(count);// 3  3条job=MANAGER记录
            conn.commit();
        } catch (Exception e) {
            if(conn!=null){
                try {
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,ps,null);
        }
    }
}

结果:
update emp1 set sal =sal * 1.1 where job =?
在这里插入图片描述
在这里插入图片描述

发布了42 篇原创文章 · 获赞 8 · 访问量 2441

猜你喜欢

转载自blog.csdn.net/JH39456194/article/details/103338454