【28-29】行级锁
2022-02-19 00:00:00 # JDBC

概述

悲观锁(行级锁)

  • 在select语句后加”for update”
  • 也叫做悲观锁
  • 事务必须排队执行,数据被锁住了,不允许并发
    1
    (select语句) for update;

乐观锁

  • 支持并发,事务也不需要排队,只不过需要一个版本号
    悲观锁与乐观锁

演示行级锁

演示行级锁01

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package _28_29_行级锁;

import _28_29_行级锁.util.DBUtil;

import java.sql.*;

/**
* 这个程序专门查询,并使用行级锁
*/
public class 演示行级锁01 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet res = 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");
res = ps.executeQuery();
while (res.next()){
System.out.println(res.getString("ename") + "\t" +
res.getString("job") + "\t" +
res.getString("sal"));
}

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

演示行级锁02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package _28_29_行级锁;

import _28_29_行级锁.util.DBUtil;

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

/**
* 这个程序负责修改被锁定的记录
*/
public class 演示行级锁02 {
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, "MANAGER");
int count = ps.executeUpdate();
System.out.println("count = " + 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);
}
}
}

解释

  1. 在代码01中commit打断点,也就是给job为”MANAGER”的人员添加行级锁,并调试执行
  2. 此是执行代码02,代码02想要修改job为”MANAGER”的人员的薪资,会发现代码02在执行过程中停止不动了
  3. 体现了行级锁的作用
Prev
2022-02-19 00:00:00 # JDBC
Next