目录
什么是事务?
事务相当于是一组对数据库的操作(如SQL语句,可以是一条,也可以是多条),这一组操作必须全部完成,事务才算完成,若有其中一条操作没完成,则全部数据回滚.
数据库事务的四个特性
- 原子性,指事务包含的操作要么全部成功,要么全部回滚
- 一致性,数据执行前和执行后,数据都是一致的,如拿转账来说,A和B存的钱加起来是5000元,A和B不管转几次账,最后都是5000元.
- 隔离性,高并发情况下,会为每个用户都建一个事务,每个事务是独立运行,相互隔离的.
- 持久性,指事务提交完后,对数据库的改变是永久性的
数据库事务的4种隔离级别
- Read uncommitted,读未提交,就是可以读还没有提交完事务的数据,可能出现脏读。
- Read committed,读和提交,oracle数据库默认隔离级别,只能等事务提交完后才能读取数据,一段时间内事务重复读取时,可能出现不可重复读
- Repeatable read,重复读,mysql数据库默认隔离级别,就是若读数据事务开启了,不允许有其它修改操作(这里的修改说的是update,如果用户刚好用insert插入了数据,可能会出现幻读)
- Serializable,序列化,最高的事务隔离级别,这里的事务全是串行化的执行,所以不会有脏读,不可重复读,幻读问题,缺点是效率很低,耗数据库性能.
Spring事务的传播特性
1.什么是传播特性?
一般Service层的方法要开启事务,可以说是一个service方法对应一个事务,但Service中的方法可能还调用了其它service的方法,要分开建立事务?还是组在一起建立事务?这时可以用spring传播特性来解决
2.spring支持7种事务传播特性:
Propagation_REQUIRED,当前事务存在,则加入到当前事务中,没有则建立一个新的事务
Propagation_SUPPORTS,当前事务存在,则加入到当前事务中,没有则按非事务流程运行
Propagation_MANDATORY,强制只使用当前事务,没有则抛异常
Propagation_REQUIERD_NEW,每次都新建一个事务,若当前已存在一个事务,则把已存在的事务挂起.
Propagation_NOT_SUPPORTED,直接非事务方式执行,若当前存在事务,把存在的事务挂起
Propagation_NEVER,绝不开启事务,如果有当前事务存在会抛异常
Propagation_NESTED,如果当前存在事务,则在嵌套事务内执行,如果没有,则新建一个事务(若当前不存在事务,则和REQUIRED一样效果)