更新丢失: 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新.
脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没提交到数据库中,这是另一个事务也访问了这个数据,然后使用了这个数据.因为这个数据是没有提交的,那么读到的这个数据就是'脏数据'
不可重复读:一个事务多次读同一个数据,在这个事务还没结束的时候,另一个事务也访问该数据.那么第一事务的两次读取数据之间,由于第二个事务的修改导致一个事务内两次读到的数据是不太一样的情况,因此称为不可重复读.
幻读:幻读与不可重复读类似,它发生在一个事务(T1)读取了将数据,接着另一个并发事务(T2)插入了一些数据时.在随后的查询中,第一个实物(T1)就会发现多了一些原本不存在的记录.就好像发生了幻卷一样,所以称为幻读.
不可重复读和幻读的区别,不可重复读的重点是修改,比如多次读取一条记录发现其中某列的值被修改.
幻读的重点在于新增和删除,比如多次读取一条记录,发现记录增多或减少了.
READ-UNCOMMITED 读未提交: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读、不可重复读。
READ-COMMITED 读已提交:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读礽有可能发生.
REPEATABLE-READ 可重复读: 对同一字段的多次读取结果都是一致的.除非数据是被本身事务自己修改,可以防止脏读和不可重复读.但是幻读仍有可能发生.
SERIALIZABLE 可串行化: 最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次执行,这样事务之间就不可能存在干扰,也就是该级别可以防止脏读、幻读、不可重复读.
MySQL默认的隔离级别是REPEATABLE-READ
Spring Boot的自动装配,已经为我们引入了事务,所以我们之际使用注解@Transcational操作事务即可.
Spring Boot设置事务隔离级别可以通过注解@Transcational(isolation=Isoliation.事务等级),如:
@Transcational(isolation=Isolation.REPEATABLE_READ)
使用注解方式实现事务管理,需要我们在配置文件中线配置事务管理器.
在service类或者service类中的方法上添加事务的注解@Transactional,注解 参数如下:
属性名 | 默认值 | 含义 |
---|---|---|
name | 方法名,可以使用通配符,遵循ant风格:必填 | |
propagation | REQUIRED | 事务传播行为;可取值包括REQURIED | SUPPORTS | MANDATORY | REQUIRES_NEW | NOT_SUPPORTED | NEVER | NESTED |
isolation | DEFAULT | 事务隔离级别;可取值包括DEFAULT | READ_UNCOMMITED | READ_COMMITED | REPEATABLE_TEAD | SERIALIZABLE |
timeout | -1 | 事务超时时间,单位:秒 |
read-only | false | 是否为只读事务 |
rollback-for | 异常类,遇到该异常会回滚事务,默认RuntimeException或Error异常 | |
no-rollback-for | 异常类,遇到该异常时不需要回滚 |
将xml配置文件改为使用configuration注解的配置类配置.其他不变.