提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
面试
提示:以下是本篇文章正文内容,下面案例可供参考
一、锁是什么?
将某种资源私有化的一种物品,没错java里面的锁也是这种特性,它可以让某个方法,某个变量或某个通道,在某个时刻下只能被一个线程占用。只有当这个锁释放了,另外的线程才可以使用。例子:上厕所,一个同事上厕所把门锁上,这个时候厕所就被上锁了,别人要想进去,只能等这位同事释放锁后出来,其他同事才可进入。这个厕所可以看成是临界区,同事就是线程。
二、数据库锁
数据的锁分为三种:
1、行级锁:被定义为是一种排它锁,防止其它事务修改。
2、表级锁:就是对当前操作的表加锁,简单,资源消耗少。
表级锁又被分为:共享锁和排它锁
3、页级锁:介于行级锁和表级锁之间的一种锁,表级锁冲突多速度快,行级锁冲突少速度慢。
三、什么是死锁?
死锁就是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,导致恶性循坏。
解决:
1:不同程序会并发存取多个表,约定以相同的顺序访问表。
2:同一事务中尽可能做到一次锁定所需要的所有资源。
3:对于容易产生死锁的业务部分,尝试升级锁定颗粒度,通过表级锁来减少死锁发生的概率。
四、Mysql解决并发
一般采用三种控制方式:悲观锁、乐观锁和时间戳
乐观锁:一个用户在读取数据的时候,别人不会去写自己所读的数据
悲观锁:和乐观锁相反,自己修改某条数据的时候,不允许别人读取该条数据。
悲观锁又被分为:共享锁和排它锁
时间戳:在数据库中单独加一列时间戳,如一个`TimeStamp`,就是每次读出来的时候,把该字段也读出来,写回去的时候把该字段+1,提交之前先和数据库的该字段进行比较,如果比数据库的值大就保存,小就不保存。
总结
自己写的,不是很好,不要喷!