事务管理简介

1.什么是事务

事务通俗的讲就是一件事情,要么作完,要么不作,事务是一个不可分割的总体 这也是事务的原子性mysql

事务的四大特性有:spring

  • 原子性 (Atomicity) -事务是不可分割的总体, 要么所有成功, 要么所有失败sql

  • 一致性(Consistency)  -事务操做数据必须保证是一致性的数据库

  • 隔离性(Isolation)  -事务之间是没有任何干扰的, A事务的执行,不会影响B事务安全

  • 持久性(Durabiltiy)  -当执行一条insert语句以后,数据库必须是保证永远存放在磁盘中并发

原子性是基础, 隔离性是手段, 持久性是目的,这三个特性都是为了给“老大”“一致性”服务的sqlserver

2.事务的隔离级别

事务的四大隔离级别(Transaction Isolation Level)分为:spa

  • READ_UNCOMMITED;//这是最低的隔离等级,容许其余事务看到没有提交的数据, 这种状况会致使脏读orm

  • READ_COMMITED;//被读取的数据能够被其余事务修改,这样会致使不可重复读, mysql sqlserver 默认的隔离级别server

       事务A 先读取了数据, 事务B接着更新了数据, 并提交了事务, 而事务A再次读取数据时,数据已经发生了改变

       形成了不可重复读

  • REPEATABLE_READ;//全部被select获取的数据都不能被修改,这样能够避免一个事务先后读取不一致的状况

       事务A读取与搜索条件匹配的若干行,事务B以插入或删除等方式修改事务A的结果集, 而后提交, 事务A再读取时

       却发现了数据发生了变化, 形成了幻读

  • SERIALIZABLE;//全部的事务都一个接一个的串行执行,这样能够避免幻读

Mysql数据库默认的事务隔离级别是READ_COMMITED

从上往下,级别愈来愈高,并发性愈来愈差,安全性愈来愈高


3.事务的传播行为

spring 一共提供了7种事务传播行为,分别是:

  • PROPAGATION_REQUIRED;

  • PROPAGATION_REQUIRED_NEW;

  • PROPAGATION_NESTED;

  • PROPAGATION_SUPPORTS;

  • PROPAGATION_NOT_SUPPORTED;

  • PROPAGATION_NEVER;

  • PROPAGATION_MANDATORY;

假设事务从方法A传播到方法B,用户须要面对方法B, 须要知道方法A有事务?

  1. 若是没有,就新建一个事务,若是有,就加入当前事务,这就是PROPAGATION_REQUIRED,它是spring默认的事务传播行为

  2. 若是没有,就新建一个事务,若是有,  就将当前事务挂起,这就是PROPAGATION_REQUIRED_NEW 从新建立新的事务

  3. 若是没有,就新建一个事务,若是有,就在当前事务中嵌套其余事务,这就是PROPAGATION_NESTED

  4. 若是没有, 就以非事务的方式执行,若是有,就使用当前事务,这就是PROPAGATION_SUPPORTS

  5. 若是没有, 就以非事务方式执行,若是有,就将当前事务挂起,, 这就是PROPAGATION_NOT_SUPPORTED

  6. 若是没有, 就以非事务方式执行,若是有,就抛出异常,这就是PROPAGATION_NEVER

  7. 若是没有, 就抛出异常,若是有, 就使用当前事务,这就是PROPAGATION_MANDATORY,没有事务就直接报错

4.数据库锁

数据库中锁主要分为悲观锁与乐观锁:

悲观锁(Pessimistic Lock) 顾名思义, 就是很悲观,, 每次去拿数据的时候都认为别人会修改, 因此每次在拿数据的时候都会上锁,

这样别人想拿这个数据就会block直到它拿到锁, 悲观锁分为: 行锁 和表锁

行锁: 锁住单行的记录

表锁: 锁住整个表的记录


乐观锁(Optimistic Lock): 顾名思义,就是很乐观, 每次去拿数据的时候都会认为别人不会修改, 因此不会上锁,可是在更新的

时候会判断一下在此期间别人有没有去更新这个数据, 可使用数据库版本号的方式来判断

相关文章
相关标签/搜索