事务通俗的讲就是一件事情,要么作完,要么不作,事务是一个不可分割的总体 这也是事务的原子性mysql
事务的四大特性有:spring
原子性 (Atomicity) -事务是不可分割的总体, 要么所有成功, 要么所有失败sql
一致性(Consistency) -事务操做数据必须保证是一致性的数据库
隔离性(Isolation) -事务之间是没有任何干扰的, A事务的执行,不会影响B事务安全
持久性(Durabiltiy) -当执行一条insert语句以后,数据库必须是保证永远存放在磁盘中并发
原子性是基础, 隔离性是手段, 持久性是目的,这三个特性都是为了给“老大”“一致性”服务的sqlserver
事务的四大隔离级别(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
从上往下,级别愈来愈高,并发性愈来愈差,安全性愈来愈高
spring 一共提供了7种事务传播行为,分别是:
PROPAGATION_REQUIRED;
PROPAGATION_REQUIRED_NEW;
PROPAGATION_NESTED;
PROPAGATION_SUPPORTS;
PROPAGATION_NOT_SUPPORTED;
PROPAGATION_NEVER;
PROPAGATION_MANDATORY;
假设事务从方法A传播到方法B,用户须要面对方法B, 须要知道方法A有事务?
若是没有,就新建一个事务,若是有,就加入当前事务,这就是PROPAGATION_REQUIRED,它是spring默认的事务传播行为
若是没有,就新建一个事务,若是有, 就将当前事务挂起,这就是PROPAGATION_REQUIRED_NEW 从新建立新的事务
若是没有,就新建一个事务,若是有,就在当前事务中嵌套其余事务,这就是PROPAGATION_NESTED
若是没有, 就以非事务的方式执行,若是有,就使用当前事务,这就是PROPAGATION_SUPPORTS
若是没有, 就以非事务方式执行,若是有,就将当前事务挂起,, 这就是PROPAGATION_NOT_SUPPORTED
若是没有, 就以非事务方式执行,若是有,就抛出异常,这就是PROPAGATION_NEVER
若是没有, 就抛出异常,若是有, 就使用当前事务,这就是PROPAGATION_MANDATORY,没有事务就直接报错
数据库中锁主要分为悲观锁与乐观锁:
悲观锁(Pessimistic Lock) 顾名思义, 就是很悲观,, 每次去拿数据的时候都认为别人会修改, 因此每次在拿数据的时候都会上锁,
这样别人想拿这个数据就会block直到它拿到锁, 悲观锁分为: 行锁 和表锁
行锁: 锁住单行的记录
表锁: 锁住整个表的记录
乐观锁(Optimistic Lock): 顾名思义,就是很乐观, 每次去拿数据的时候都会认为别人不会修改, 因此不会上锁,可是在更新的
时候会判断一下在此期间别人有没有去更新这个数据, 可使用数据库版本号的方式来判断