数据库并发性问题

时间:2020-10-11 22:53:00 来源:互联网 作者: 神秘的大神 字体:

数据库并发性问题


数据库并发性问题指的是多个事务可以同时访问数据库中的数据,当多个事务在数据库中并发执行时,数据的一致性可能收到破坏,从而导致数据出现问题。

事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。



事务的四大属性(ACID)


  • 原子性(Atomicity)

    原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

  • 一致性(Consistency)

    一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  • 隔离性(Isolation)

    隔离性是当多个用户并发访问数据库时,数据库为每一个用户开启事务,不能被其他事物的操作所干扰,多个并发事务之间要相互隔离

  • 持久性(Durability)

    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的情况下也不会丢失事务的操作。


悲观锁

悲观锁就是某个事务在更新数据过程中将数据锁定,其他任何事务都不能读取或修改,必须修改完成后才能访问数据(类似于Java的线程同步锁机制)。悲观锁的特点是具有排他性,通常依赖于数据库的锁机制,一般适合短事务处理。

select * from table_name where id=1 for update

乐观锁

乐观锁并不是一种数据库锁机制,而是一种冲突检测机制(版本冲突检测机制的时间冲突检测机制),它的特点就是并发性较好,事务修改数据时,其他事务仍可以修改数据。


版本冲突检测机制原理
即每个数据表中有一个版本字段 version,某一个事务更新数据后版本号+1,另一个事务更新后再+1,当事务发现数据库当前版本号与读取数据时版本号不一致时,说明在读取数据后该数据已被其他事务修改,则不能更新数据。


乐观锁相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以只会在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回用户错误的信息,让用户决定如何去做。乐观锁的特点是并发性较好,事务修改数据时,其他事务仍可以修改数据。