1.以下这个程序开启一个事物,这个事物专门进行查询,并且使用行级锁/悲观锁,锁住相关的记录
package com.bjpowernode.jdbc;
import com.bjpowernode.jdbc.utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 这个程序开启一个事物,这个事物专门进行查询,并且使用行级锁/悲观锁,锁住相关的记录
*/
public class JDBCTest10 {
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")+","+res.getString("job")+","+res.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,res);
}
}
}
2.以下程序负责修改被锁定的记录
package com.bjpowernode.jdbc;
import com.bjpowernode.jdbc.utils.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 这个程序负责修改被锁定的记录
*/
public class JDBCTest11 {
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 = 200 where job = ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"MANAGER");
int count = ps.executeUpdate();
System.out.println(count);
conn.commit();
} catch (Exception e) {
if (conn != null){
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
DBUtil.close(conn,ps,null);
}
}
}
3.以下是DBUtil工具类
package com.bjpowernode.jdbc.utils;
import java.sql.*;
/**
* JDBC工具类,简化JDBC编程。
*/
public class DBUtil {
/**
* 工具类中的构造方法都是私有的。
* 因为工具类当中的方法是静态的,不需要new对象,直接采用类名调用。
*/
private DBUtil(){}
//静态代码块在类加载时执行,并且只执行一次
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取数据库连接对象
* @return 连接对象
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","root");
}
/**
* 关闭资源
* @param conn 连接对象
* @param ps 数据库操作对象
* @param res 结果集
*/
public static void close(Connection conn, Statement ps, ResultSet res){
if(res != null){
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
innodb支持行级锁,myisam不支持行级锁
4.以下是表结构,注意:表引擎必须是innodb的,因为innodb支持行级锁,myisam不支持行级锁。
CREATE TABLE emp
(
EMPNO
int(4) DEFAULT NULL,
ENAME
varchar(10) DEFAULT NULL,
JOB
varchar(9) DEFAULT NULL,
MGR
int(4) DEFAULT NULL,
HIREDATE
date DEFAULT NULL,
SAL
double(7,2) DEFAULT NULL,
COMM
double(7,2) DEFAULT NULL,
DEPTNO
int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;