数据库事务管理

1 什么事务

事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行

2 事务的特性

  • 原子性(Atomically):事务是应用中不可再分的最小执行体
  • 一致性(Consistency):执行的结果需使得数据从一个一致性状态变为另一个一致性的状态
  • 隔离性(Isolation):各个事务的执行互不干扰,任何事物的内部操作对其他事务都是隔离的
  • 持久性(Durability):事务一旦提交,对数据所作的任何改变都要记录到永久存储器中【数据库】
3事务的隔离性与隔离级别

在高并发的场景下,每个线程将使用不同的事务对数据库中的数据进行处理,在各个事务互不影响的情形下,容易发生下列并发异常:【强调cpu的执行速度极快,考虑到网络延时等问题,异常会在极短的时间内发生】

  • 第一类丢失更新,第二类丢失更新
  • 脏读,幻读,不可重复读

第一类丢失更新:某一个事务的回滚导致另一个事务更新的数据丢失

数据库事务管理_第1张图片

第二类丢失更新:某一个事务的提交导致另一个事务更新的数据丢失

数据库事务管理_第2张图片

脏读:某个事务读取到另一个事务还未提交的数据

数据库事务管理_第3张图片

不可重复读:某一个事务前后读取的数据不一致【强调的数据的修改】

数据库事务管理_第4张图片

幻读 :某一个事务对表查询的行数不一致【强调数据的插入,删除】

数据库事务管理_第5张图片

为了解决以上事务隔离性带来的问题,事务存在相应的隔离级别,隔离级别从低到高

隔离级别 含义
1 Read Uncommitted(未提交读) 一个事务能读取到其他事务修改过,但是还没有提交的(Uncommitted)的数据。上述异常均会发生
2Read Committed(已提交读) 一个事务能读取到其他事务提交过(Committed)的数据。一个事务在处理过程中如果重复读取某一个数据,而且这个数据恰好被其他事务修改并提交了,那么当前重复读取数据的事务就会出现同一个数据前后不同的情况。会发生“不可重复读,幻读”的异常
3Repeatable read(可重复读) 一个事务一旦开始,事务过程中所读取的所有数据不允许被其他事务修改。它只“保护”了它读取的数据不被修改,但是其他数据会被修改。如果其他数据被修改后恰好满足了当前事务的过滤条件(where语句),那么就会发生“幻影读”的情况。
4Serializable(序列化) 系统中所有的事务以串行地方式逐个执行,所以能避免所有数据不一致情况。但是这种以排他方式【加锁】来控制并发事务,串行化执行方式会导致事务排队,系统的并发量大幅下降

数据库事务管理_第6张图片

4事务实现机制
4.1数据库锁

通过给数据库中被操作的数据加锁来实现,分为共享锁【读锁】,互斥锁【写锁】

4.2 版本号与时间戳

在更新数据前,需要检查版本号是否发生了变化,变化了则取消更新,否则成功更新数据

你可能感兴趣的:(java学习笔记,数据库开发,后端)