重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
保证数据安全,处理多用户并发访问。悲观锁,锁如其名,他对世界是悲观的,他认为别人访问正在改变的数据的概率是很高的,所以从数据开始更改时就将数据锁住,知道更改完成才释放。乐观锁,他对世界比较乐观,认为别人访问正在改变的数据的概率是很低的,所以直到修改完成准备提交所做的的修改到数据库的时候才会将数据锁住。完成更改后释放。悲观锁会造成访问数据库时间较长,并发性不好,特别是长事务。乐观锁在现实中使用得较多,厂商较多采用。
我们提供的服务有:网站建设、网站设计、微信公众号开发、网站优化、网站认证、安多ssl等。为成百上千企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的安多网站制作公司
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
假如要按照你这种 悲观锁 的处理机制的话, 那么
Connection conn 要定义在外面, 也就是类这个级别。
例如
public class Test {
Connection conn;
public Product get(id) {
conn = getConn();
conn.startTraction();
...............select * from product where id = 10 for update;
}
public void update(long id) {
// 这个时候, 用类一个级别的 Conn , 不用新建
update product set name = 'xxx' where id = :id;
// 更新完毕后
Commit 事务。
关闭 Conn.
}
}
上面的只是 原理的 例子, 实际情况下,不推荐这么写
因为 如果有人 只 Product get(id) 不 update(long id) 的话, 事情就麻烦了。
乐观锁和悲观锁的区别如下:
1、悲观锁是当线程拿到资源时,就对资源上锁,并在提交后,才释放锁资源,其他线程才能使用资源。
2、乐观锁是当线程拿到资源时,上乐观锁,在提交之前,其他的锁也可以操作这个资源,当有冲突的时候,并发机制会保留前一个提交,打回后一个提交,让后一个线程重新获取资源后,再操作,然后提交。和git上传代码一样,两个线程都不是直接获取资源本身,而是先获取资源的两个copy版本,然后在这两个copy版本上修改。
3、悲观锁和乐观锁在并发量低的时候,性能差不多,但是在并发量高的时候,乐观锁的性能远远优于悲观锁。
4、常用的synchronized是悲观锁,lock是乐观锁。