1、jdbc中使用行級鎖的步驟java
1.1必須將自動提交方式改成手動提交sql
1.2查詢語句後面使用for update(引發事務、啓動行級鎖) 好比: select * from user where userid in(10001,10002) for update;的意思是啓動行級鎖,鎖住userid爲10001和10002的這兩條數據。spa
1.3啓動行級鎖的目的是隻有當前事務才能修改鎖住的數據。code
1.4結束事務(提交|回滾)的時候釋放行級鎖。對象
2、jdbc中使用行級鎖的示例blog
package edu.aeon.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import edu.aeon.aeonutils.AeonJdbcUtils; /** * [說明]:修改jdbc中事務的提交方式 * @author aeon */ public class TestJDBC { /** * @throws SQLException */ public static void jdbc_insert() throws SQLException{ Connection connection=null; PreparedStatement preparedStatement = null; try { connection = AeonJdbcUtils.getMySqlConnection(); //設置事務的提交方式爲手動提交 connection.setAutoCommit(false); String sql="select userid,username,userpw from user where userid in(?,?) for update"; //將sql語句進行預編譯而後保存到preparedStatement對象中 preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 10001); preparedStatement.setInt(2, 10002); preparedStatement.executeQuery(); sql="update user set username='hjs' where userid in(?,?)"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 10001); preparedStatement.setInt(2, 10002); int rowCount=preparedStatement.executeUpdate(); connection.commit(); System.out.println("成功修改了"+rowCount+"條數據!"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { connection.rollback(); System.out.println("本次操做失敗!"); e.printStackTrace(); }finally { AeonJdbcUtils.closeDB(null, preparedStatement, connection); } } public static void main(String[] args) { try { jdbc_insert(); } catch (SQLException e) { System.out.println("本次操做失敗!"); e.printStackTrace(); } } }
運行結果截圖:事務
啓動行級鎖的目的是隻能讓當前事務修改數據、其它事務不能對鎖住的數據作修改操做!get