Springboot-Spring声明式事务
·
声明式事务和编程式事务
声明式事务通过注解完成;
首先在启动类上加
@EnableTransactionManagement开启基于注解的事务管理在serviceImpl的方法上添加@Transactional注解,表示方法执行开启事务;
在类上添加注解@Transactional表示所有方法开启事务;
@Transactional参数
transactionManager属性,事务管理器;控制事务提交、回滚;事务管理器transactionManager 控制提交和回滚
事务拦截器transactioninterceptor 控制合适回滚;
propagation 传播行为isolation隔离级别timeout(3)事务超时时间3sreadOnly(true)只读;底层优化只读;隔离级别
Propagation propagation() default Propagation.REQUIRED;传播行为Isolation isolation() default Isolation.DEFAULT;rollbackFor 指明那些异常需要回滚;不是所有异常都会回滚,编译时异常不回滚; 运行时异常(unchecked exception)10/0都回滚@Transactional(rollbackFor = Exception.class)norollbackFor
@Transactional(rollbackFor = Exception.class, noRollbackFor = ArrayIndexOutOfBoundsException.class)
隔离级别
MySQL写数据时会加锁,所以写操作做没有隐患问题
但是最怕就是一读一写;数据不同步;
脏读:读事务读到没提交的数据(脏读);
不可重复度读:多次读取的数据不一样;
READ_UNCOMMITTED(1),读未提交
READ_COMMITTED(2),读已提交 只能读到已提交的数据;但是读取多次可能数据不一样(因为修改可能前面没提交,后面提交了)
REPEATABLE_READ(4),可重复读,也叫快照读,第一次读取拿到一个快照,在当前事务中永远用这个数据;
SERIALIZABLE(8);串行化
MySQL默认是可重复读,oracle默认是读已提交
传播行为(isolation)
控制小事务和大事务中的关系;
REQUIRED(0)(支持大事务,不存在则创建新事务)
SUPPORTS(1) (支持大事务,不存在则不用事务)
MANDATORY(2)(支持大事务,不存在则抛出异常)
REQUIRES_NEW(3)(创建一个新事务,如果当前有大事务则大事务挂起,先跑我自己的事务)
NOT_SUPPORTED(4)(非事务执行,如果当前有大事务,大事务暂定,先执行自己的非事务)
NEVER(5),不使用事务,如果有大事务抛异常;
NESTED(6)
课间休息-源码
双检查锁机制
锁为了保证并发时只有一个线程创建
双检查:不重复创建
IOC容器的启动
更多推荐

所有评论(0)