一、数据库的锁(我要谈几个主要问题。 拿去面试就足够了。 也就是说,低锁、表锁、悲观锁、乐观锁。
【首先是重要的问题。 为什么要锁门? 】
这是为了避免在并发操作过程中发生诸如多个事务访问和修改数据之类的操作。 如果不进行控制,则会发生脏读、不可重复读、幻像读、死锁等。 为了解决这个问题,有锁定机构。 简单来说,一个sql语句执行时需要一个锁定,在该语句未执行之前,其他事务无法处理数据。 在、
【另一个问题:锁定的实现原理? 】
(添加:
MySQL以表级锁定为主,如果资源锁定粒度大且一个session锁定一个表的时间过长,其他session将无法更新此表中的数据。 InnoDB引擎中的表可以在行级锁定,但行级锁定的机制取决于表的索引。 如果表中没有索引,或者sql语句中没有使用索引,则使用表级锁定。
Oracle使用行级锁定,因此资源的锁定粒度相当小。 但是,锁定和锁定sql所需的资源是数据库中的数据行,与索引无关。 所以Oracle
对性的支持一直很好。 )
行锁定:锁定单个行记录。
表锁定:直接锁定整个表。 在锁定期间,其他进程无法写入该表。 如果你是写锁定,其他进程即使阅读也不允许。
悲观锁定:对所有操作都持悲观态度,并在访问之前请求锁定,假设每次事务处理数据时都会修改其他事务需要访问的数据。
乐观锁定:相反,在执行更新修改操作时,只需确定访问期间是否有人修改了数据
二、事务隔离的四个级别未提交读取、已提交读取、可重复读取、可序列化
四大特征:
)1)原子性
事务必须是原子工作单元。对于其数据修改,可以全部执行,也可以不全部执行。
)2)一致性
事务一致性意味着数据库在事务执行之前和之后都必须保持一致。 事务结果必须将数据库从一个一致性状态更改为另一个一致性状态。
(3)隔离(对于事务的隔离数据库提供了不同的隔离级别)。
一个事务的执行不能干扰其他事务。 也就是说,一个事务中的操作和所使用的数据与其他并发事务是分离的,不能在同时执行的事务之间相互干扰。
)4)持续性
事务完成后,数据库中的数据更改将是永久的。 即使发生系统故障,此修复也是一个
隔离级别:
隔离级别脏读(不可重复读)无可重复读(幻像读) Phantom Read (未提交读)读未提交(已提交读)读建议不可能、不可序列化(Serializable )、不可脏读)一个事务访问数据,对数据进行了修改,未提交,但另一个事务使用此数据将读取的此数据称为脏数据
不可重复读取:一个事务a多次读取数据。 假设在第一次读取数据时,另一个事务b修改了数据,并且a读取两次的数据不匹配。
幻读:事务a对数据执行修改操作,事务b对数据执行插入操作。 事务a查询时,可以看到有些数据没有像幻像一样被修改。