Java操作数据库(行级锁,for update)

网友投稿 378 2022-09-09


Java操作数据库(行级锁,for update)

目录一、悲观锁(也叫行级锁)1.使用悲观锁(在事务中的sql语句中使用)2..完整代码3..测试代码4.结论

一、悲观锁(也叫行级锁)

在本次事务的执行过程当中,我们指定的记录被查询,在我查询的过程当中记录就会被锁定,任何人,任何事务都不能对我指定查询数据进行修改操作(不能改,但是可以看),直到我都查询结束。

1.使用悲观锁(在事务中的sql语句中使用)

//sql指令

String sql = "select * from t_shuihuo where id < ? for update ";

2..完整代码

package com.luosf.jdbc;

import com.luosf.jdbc.utils.JdbcUtil;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

/**

* JDBC中锁的使用

* for updata

*/

public class JdbcLock {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement stat = null;

ResultSet res = null;

try {

//创建驱动

//获取数据库对象

conn = JdbcUtil.getConnection();

//sql指令

String sql = "select * from t_shuihuo where id < ? for update ";

conn.setAutoCommit(false);//开启事务

//3,sql语句进行编译

stat = conn.prepareStatement(sql);

//给占位符填充值

//JDBC下标从1开始的

stat.setInt(1,16); //1,代表第一个问号

Thread.sleep(1000*10); //模拟访问时间

//4,执行sql

res = stat.executeQuery();

//5,处理查询结果集

while (res.next()){

int id = res.getInt("id");

String name = res.geidggaGzLtString("name");

String nickname = res.getString("nickname");

System.out.println("id :"+ id + " name :" +name + " 昵称 :"+nickname);

}

conn.commit();//提交事务

} catch (SQLException throwables) {

try {

if (conn != null){

conn.rollback(); //回滚事务

}

} catch (SQLException e) {

e.printStackTrace();

}

throwables.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

} finally{

//释放资源

JdbcUtil.close(conn,stat,res);

}

}

}

3..测试代码

package com.luosf.jdbc;

import com.luosf.jdbc.utils.JdbcUtil;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

/**

* 检测锁

*/

public class JdbcLockTest {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement stat = null;

try {

//获取驱动

//获取数据库链接对象

conn = JdbcUtil.getConnection();

//开启事务

conn.setAutoCommit(false);

//锁开始后进行修改数据

String sql = "update t_shuihuo set name = '小罗' where id = ? ";

stat = conn.prepareStatement(sql);

stat.setInt(1,10); //1,代表第一个问号

int cunt = stat.executeUpdate();

System.out.println("更新了"+cunt+"条数据");

conn.commit();//提交事务

} catch (SQLException throwables) {

try {

if (conn != null){

conn.rollback();

}

} catch (SQLException e) {

e.printStackTrace();

}

throwables.printStackTrace();

} finally {

//释放资源

JdbcUtil.close(conn,stat,null);

}

}

}

需要等锁等待时间完成才能进行修改

4.结论

在mysql当中:

在执行“select ... from ....whrer ...for update ”对,MySQL进行row lock(行锁) 还是 table lock(表锁),取决于是否使用索引(如主键,unique字段),则为row lock(行锁),否则为 table lock(表锁),没有查找到数据为无锁,当使用“<>” 或者“like”时,索引会失效,进行 table lock(表锁)。

简单点来说就是for update最好锁 主键或者unique字段,锁其他字段会导致整张表被锁。导致性能的降低


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:BGP动态路由协议(BGP路由宣告)
下一篇:bgp的配置(bgp的配置命令)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~