怎么用数据库的悲观锁来实现一个分布式的锁
这篇“怎么用数据库的悲观锁来实现一个分布式的锁”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用数据库的悲观锁来实现一个分布式的锁”文章吧。
创新互联不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的网站设计、成都做网站质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式网络营销推广需求,让再小的成都品牌网站建设也能产生价值!
分布式锁顾名思义是发生在分布式环境中的。对于单进程场景,我们可以使用语言和类库提供的锁,对于分布式锁,我也可以使用分布式锁。也就是说同样的锁使用的环境不同,分布式环境中用的锁就叫分布式锁!
根据上面的理解,分布式锁是不是应该具备下面的特点:
分布式锁必须保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行;
一个线程获得了锁,其他线程必须等待持有锁的线程释放掉才能再获取;
锁必须要有超时机制(避免死锁)
基于上面的特点,我们就可以通过数据库的悲观锁来实现一个分布式锁。
代码非常的简单,使用 for update 即可。具体如下:
public class XttblogLock {
private DataSource dataSource;
private static final String cmd = "select * from xttblog_lock where id = 1 for update";
public XttblogLock(DataSource ds) {
this.dataSource = ds;
}
public static interface CallBack{
public void doAction();
}
public void lock(CallBack callBack) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//try get lock
System.out.println(Thread.currentThread().getName() + " begin try lock");
conn = dataSource.getConnection();
conn.setAutoCommit(false);
stmt = conn.prepareStatement(cmd);
rs = stmt.executeQuery();
//do business thing
callBack.doAction();
//release lock
conn.commit();
System.out.println(Thread.currentThread().getName() + " release lock");
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (null != conn) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
该锁的调用也非常的简单,具体代码如下:使用数据库悲观锁实现分布式锁主要用了数据库的 for update 命令,执行改命令后,对应行记录会被锁住,其它线程会被阻塞主,直到获取到这行记录的线程提交了事务。这里需要注意要把自动提交设置为 false。
该锁的调用也非常的简单,具体代码如下:
final XttblogLock xttblogLock = new XttblogLock(dataSource);
xttblogLock.lock(new CallBack() {
@Override
public void doAction() {
System.out.println(Thread.currentThread().getName() + "beging do somthing");
try {
System.out.println("业余草:www.xttblog.com 欢迎你!");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "end do somthing");
}
});
虽然数据库的 for update 悲观锁可以用来做分布式锁,但实际的生产过程中采用这种方法的非常少,因为它性能不是很高。
以上就是关于“怎么用数据库的悲观锁来实现一个分布式的锁”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。
文章名称:怎么用数据库的悲观锁来实现一个分布式的锁
当前地址:http://myzitong.com/article/gdjsei.html