声明式事务和编程式事务

声明式事务通过注解完成;

首先在启动类上加

@EnableTransactionManagement开启基于注解的事务管理

在serviceImpl的方法上添加@Transactional注解,表示方法执行开启事务;

在类上添加注解@Transactional表示所有方法开启事务;

@Transactional参数

transactionManager属性,事务管理器;控制事务提交、回滚;

事务管理器transactionManager 控制提交和回滚

事务拦截器transactioninterceptor 控制合适回滚;

propagation 传播行为
isolation隔离级别
timeout(3)事务超时时间3s
readOnly(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容器的启动

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐