事务有四个特性:ACID
- 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
- 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
- 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
- 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
Spring框架事务管理涉及的接口的联系如下:
@Transactional的属性
| 属性名 | 类型 | 说明 |
| isolation | 枚举org.springframework.transaction.annotation.Isolation的值 | 事务隔离级别 ,默认值Isolation.DEFAULT |
| noRollbackFor | Class<? extends Throwable>[] | 一组异常类,遇到时不回滚。默认为{} |
| noRollbackForClassName | Stirng[] | 一组异常类名,遇到时不回滚,默认为{} |
| propagation | 枚举org.springframework.transaction.annotation.Propagation的值 | 事务传播行为 ,默认值 Propagation.REQUIRED |
| readOnly | boolean | 事务读写性 ,默认false |
| rollbackFor | Class<? extends Throwable>[] | 一组异常类,遇到时回滚 |
| rollbackForClassName | Stirng[] | 一组异常类名,遇到时回滚 |
| timeout | int | 超时时间,以秒为单位 ,ransactionDefinition.TIMEOUT_DEFAULT |
| value | String | 可选的限定描述符,指定使用的事务管理器 |
事务传播行为类型:
| 事务传播行为类型 | 说明 |
| PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。默认值 |
| PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
| PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
| PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
| PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
| PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
| PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。 |
事物隔离级别
| 隔离级别 | 隔离级别的值 | 导致的问题 |
| Read-Uncommitted | 0 | 导致脏读 |
| Read-Committed | 1 | 避免脏读,允许不可重复读和幻读 |
| Repeatable-Read | 2 | 避免脏读,不可重复读,允许幻读 |
| Serializable | 3 | 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重 |
名词解释:
- 脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。
- 不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。
- 幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。
提示:
- 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
- 大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle
- 少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB
Spring 中的隔离设置
ISOLATION_DEFAULT 这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应。
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
注意:
1.使用注解事物,必须在spring配置中开启事物
2.@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。所以,spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。
https://blog.xqlee.com/article/81.html
评论