hjs557523 / hjs557523/notes

Spring事务管理 —— @Transactional

Open
#1 0 comments 6 reactions 0 assignees View on GitHub
Java
Dominant language
No language data
Stars
1
Forks
0
PR merge metrics
No merged PRs in 30d

Description

对`Java`相关知识进行总结,涉及`框架`,`源码`,`项目开发`,`设计模式`,`并发设计`等。
## 框架
### 注解
#### `@Transactional`——Spring事务管理

> 注解失效情况:

- 不要在接口上声明`@Transactional`,而要在具体类的方法上使用`@Transactional`注解,否则注解可能无效;

- 使用了`@Transactional`的方法,必须是public;因为`@Transactional`注解的方法被外部其他类调用才有效。如果在 protected、private 或者 package-visible 的方法上使用了 `@Transactional `,不会报错,但事务无效;

- 使用了`@Transactional`的方法,被同一个类里面的方法调用,`@Transactional`无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。

> 使用场景:

- 不应该将`@Transactional`放置在类级的声明中,如果放在类声明,会使得该类下的所有方法都有事务。一般在service里加`@Transactional`注解,不建议在接口上添加。加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。

- `@Transactional`应该放在方法级别,对于不需要使用事务的方法,就不要放置事务,比如查询方法,否则对性能是有影响的。启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。

```java
//service层
@Transactional
@CacheEvict(allEntries = true)
@Override
public int updatePassword(Integer tid, String password) {
return teacherMapper.updatePassword(tid, password);
}
```

> 事务回滚:

- 抛出受查异常checked Exception,事务不会回滚;如果是checked异常也想回滚的话,注解上写明异常类型即可;
```java
@Transactional(rollbackFor=Exception.class)
```
- 抛出运行时异常 unchecked Exception,事务进行回滚;

- Quartz中,execute直接调用加了`@Transactional`方法,可以回滚;间接调用,不会回滚。(即注解失效第3点提到的)

- 异步任务中,execute直接调用加了`@Transactional`方法,可以回滚;间接调用,不会回滚。(即注解失效第3点提到的)

- 在action中加上`@Transactional`,不会回滚。切记不要在action中加上事务

- 在service中加上`@Transactional`,如果是action直接调用该方法,会回滚,如果是间接调,不会回滚。

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.