mysql常见实现分布式锁的方式
public void createByLock(Supplier<String> supplier) {
Connection connection = null;
Boolean connAutoCommit = null;
PreparedStatement preparedStatement = null;
try {
//这里dataSource是数据源,自己业务实际写的时候需要在类里面设置好数据源这个变量
//可以通过spring的自动注入也可以通过其他方式等
connection = dataSource.getConnection();
connAutoCommit = connection.getAutoCommit();
//设置连接为手动提交
connection.setAutoCommit(false);
preparedStatement = connection.prepareStatement(“select * from job_lock where job_name=’create_lock’ for update”);
//获取锁 (如果当前事务没有提交别的线程进来会阻塞)
preparedStatement.execute();
//执行业务操作
String result = supplier.get();
logger.info(“业务操作执行结果:{}”, result);
} catch (Exception ex) {
logger.error(ex.toString());
} finally {
if (connection != null) {
try {
//提交事务
connection.commit();
//恢复自动提交
connection.setAutoCommit(connAutoCommit);
connection.close();
} catch (SQLException ex) {
logger.error(ex.toString());
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException ex) {
logger.error(ex.toString());
}
}
}
}
调用方法示例
代码如下(示例):
业务操作执行的时候只须记住7个字:一锁二查三更新
/**
* 业务操作示例
*/
public void create() {
createByLock(() -> {
//1.获取锁之后比如先查询数据是不是存在或者是否更新
//2.不存在或者没有更新执行相关操作
logger.info(“在这里执行业务操作”);
return “业务操作成功”;
});
}
由于job_lock表只有一条数据,所有调用此方法的请求都要去拿同一把锁,在并发量高或者业务操作执行比较耗时的情况下很有可能导致锁等待超时等问题,导致业务执行失败,比如业务表里不存在的数据,在保存的时候因为获取锁超时导致插入失败。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » mysql常见实现分布式锁的方式