## 注解方式

1. 需要申请配置事物管理 (在spring beans配置文件中)

```

```

2. 启用事务注解(在spring beans配置文件中)

```

```

3. 在需要开启事物的方法上添加注解 `@Transactional`

>### Transactional属性

- **PROPAGATION**设置事物的传播行为

当一个事务方法,调用另外一个事务方法的时候。

**需要在被调用的事物是使用PROPAGATION属性**。

(常用的两个`PROPAGATION_REQUIRED`,`PROPAGATION_REQUIRES_NEW`)

1. REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

2. REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

3. SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

4. MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

5. NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

6. NESTED-- 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。

- `isolation`设置事务的隔离级别 `isolation=Isolation.READ_COMMITTED`最常用

- 默认spring声明式事务对所有异常回滚,也可以去做设置,但是一般不做。

- 只读事务,表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务。

使用`readOnly `指定事务是否为只读,由于事务可以在行和表上获得锁,因此长事务会占用资源,对整体性能产生影响。

如果一个事务只读取数据,但是不做修改,数据库引擎可以对这个事务进行优化。

- 超时事务属性,事务在强制回滚之前可以保持多久,这样可以防止长期运行的事务占用资源。`timeout `秒。

## XML文件配置方式(与AOP配合使用)

1. 配置事务管理器(同注解方式)

2. 配置事务属性

```

3. 配置事务切入点

```