在java项目中如何运用mysql悲观锁
时间: 2023-11-28 09:51:13 浏览: 79
mysql的乐观锁、悲观锁.md
在 Java 项目中使用 MySQL 悲观锁主要是通过 SQL 语句的 `SELECT ... FOR UPDATE` 或 `SELECT ... LOCK IN SHARE MODE` 实现的。
`SELECT ... FOR UPDATE` 语句会对查询结果的每一行加上排它锁(Exclusive Lock),其它事务无法对这些行进行修改或者加排它锁,直到当前事务结束,这种方式适用于需要修改的场景。
`SELECT ... LOCK IN SHARE MODE` 语句会对查询结果的每一行加上共享锁(Shared Lock),其它事务可以对这些行进行查询但是无法修改或者加排它锁,直到当前事务结束,这种方式适用于只读场景。
下面是使用 `SELECT ... FOR UPDATE` 的示例代码:
```java
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement("SELECT * FROM my_table WHERE id = ? FOR UPDATE");
pstmt.setLong(1, 1L);
rs = pstmt.executeQuery();
// 对查询结果进行修改
} catch (SQLException e) {
// 异常处理
} finally {
// 关闭连接和释放资源
try { rs.close(); } catch (Exception e) {}
try { pstmt.close(); } catch (Exception e) {}
try { conn.close(); } catch (Exception e) {}
}
```
在以上示例代码中,通过 `SELECT ... FOR UPDATE` 查询 id 为 1 的记录并加上排它锁,然后对查询结果进行修改。
需要注意的是,使用悲观锁会对数据库性能有影响,因为在锁定期间其它事务无法访问被锁定的数据。因此,在使用悲观锁时需要谨慎权衡性能和数据一致性的需求。
阅读全文