MySQL 第十一章 悲观锁和乐观锁

文章目录

    • 1.概述
    • 2.示例
  • 传送门

1.概述

悲观锁:事务必须派对执行。数据被锁住了,不允许并发(悲观锁、行级锁:select后面添加for update)

select ename,job,sal from emp where job='MANAGER' for update;

乐观锁:支持并发,事务不需要排队,需要一个版本号

2.示例

public class JDBCTest12 {
    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 = ? for update";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "MANAGER");
            rs = ps.executeQuery();
            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 e1) {
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
    }
}
package com.bjpowernode.jdbc;

import com.bjpowernode.jdbc.util.DBUtil;

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

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 emp set sal = sal*1.1 where job = ?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, "MANNAGER");
            int count = ps.executeUpdate();
            System.out.println(count);
            conn.commit();
        } catch (Exception e) {
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, null);
        }
    }
}

传送门

上一章:MySQL 第十章 数据库设计三范式
下一章:MySQL 第十二章 练习题

你可能感兴趣的:(MySQL,mysql)