悲观锁(行级锁 for update)和乐观锁机制

 

 

 

 
悲观锁案例:
package com.java.JDBC;


import util.DBUtil;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
* 这个程序开启一个事务,这个四五专门进行查询,并且使用行级锁/悲观锁,锁住相关的记录。
*/
public class JDBCTest13 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
    
        try {
            // 获取连接
            conn = DBUtil.getConnection();
            // 开启事务
            conn.setAutoCommit(false);
            // 获取数据库对象
            String sql = "select ename,job,sal from emp where job = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"MANAGER");
            
            rs = ps.executeQuery();
            while (rs.next()){
                String ename = rs.getString("ename");
                String job = rs.getString("job");
                Double sal = rs.getDouble("sal");
                System.out.println(ename + " " + job + " " + sal);
            }
            // 提交事务
            conn.commit();
        } catch (SQLException e) {
            if (conn != null){
                try {
                    // 回滚事务(事务结束)
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            DBUtil.close(conn,ps,rs);
        }
    }
}

 

 

package com.java.JDBC;


import util.DBUtil;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
* 这个程序负责修改被锁定的记录
*/
public class JDBCTest14 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
    
        try {
            // 获取连接
            conn = DBUtil.getConnection();
            // 开启事务
            conn.setAutoCommit(false);
            String sql = "update emp set sal = sal * 1.1 where job = ? for update";
            ps = conn.prepareStatement(sql);
            ps.setString(1,"MANAGER");
            
            int count = ps.executeUpdate();
            System.out.println(count);
            
            // 提交事务
            conn.commit();
        } catch (SQLException e) {
            if (conn != null) {
                try {
                    // 回滚事务
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            DBUtil.close(conn,ps,null);
        }
    }
}

 

 
 
 
posted @ 2020-09-11 20:41  xlwu丶lz  阅读(473)  评论(0编辑  收藏  举报