技术博客

数据库锁机制

2020-12-30  本文已影响0人  Lovealfy

乐观锁: 当线程去取数据的时候,总是认为不会修改数据,不会发送并发问题,因此没有上锁,只有在线程提交数据时会用过检查版本号的形式检测数据有没有被修改过。 总是假设最好的情况

悲观锁:  悲观锁和乐观锁就是相反的存在,他总是认为别人(别的线程)会对数据进行修改,所以都会加锁(读锁,写锁等等)一次只能允许一个线程对数据进行修改,其他线程会被阻塞挂起, java中的synchronized关键字的实现思想就是悲观锁实现:大多数情况下依靠数据库的锁机制实现 。特点:总是假设是最坏的情况

乐观锁和悲观锁的区别

a. 加锁时机不同:

1.悲观锁,从数据开始修改时就将数据锁住,直到更改完成才释放锁

2.乐观锁,直到数据修改完准备提交时才上锁,完成后释放

死锁

如果两个事物分别锁定了两个单独的对象,这时每一个事务都要求在另一个事务锁定的对象上获得一个锁,因此,每一个事务都必须等待另一个事务释放当前占有的锁

当发生死锁现象时,系统可以自动检测到,然后通过自动取消其中一个事务来结束死锁,根据事务处理时间长短来确定事务的优先级,处理时间长的事务优先级较高,当发生冲突时,保留优先级高的事务,取消优先级低的事务

数据库的事务机制

为什么需要事务?
    在实际中存在并发访问数据的问题,为了解决并发访问所产生的问题。
事务的基本操作:

    1、开启一个事务
    2、进行一系列的数据操作
    3、提交或回滚事务,提交成功则将数据持久化到数据库,否则该事务中的所有数据操作全部无效

事务的ACID原则
    原子性、一致性、隔离性、持久性
一个事务内的所有操作都是原子性的,要么全部成功,要么全部失败,一致性是ACID原则中最基础的特性,其他三个特性都是为了保证一致性而存在的。隔离性,不同事务之间的操作互不影响,数据库对于事务存在着不同的隔离级别,持久性,事务的操作一旦完成,必须持久化到数据库中

并发访问数据会造成什么问题?

脏读、不可重复读、幻读

脏读: 当事务A在修改记录但还未提交时,另一个事务读取了该记录,此时事务B读到的数据就是脏数据,如果此时事务A回滚了事务,则事务B读到的数据无效。

不可重复读:在一个事务中前后两次读取的数据不一样

幻读 :当事务A在读取记录时,另一个事务B插入了新纪录并提交,导致事务A再次查询记录时多出了不存在的记录,就看到了幻觉一样。

事务的隔离级别:

事务的隔离级别描述了事务被隔离的程度,其隔离级别有4个,读未提交、读提交(大多数数据库系统的默认隔离级别,解决了脏读)、可重复读(MySQL默认,解决了脏读和不可重复读)、可串行化

上一篇下一篇

猜你喜欢

热点阅读