事务的四个特效
- 原子性:表示一个事务中的多个数据库操作是不可分割的单元,只有所以的操作都成功后,整个事务才能提交,事务中任何一个操作失败,之前成功的操作都必须撤回,让数据库回到事务开始的状态。
- 一致性:事务完成后,数据库所处的状态和它的业务规则保持一致。
- 隔离性:并发操作的时候,不同事务之间应该互相隔离,避免干扰。并不是完全无干扰,隔离级别越高,并发性越弱,根据具体业务需求来。
- 持久性:事务成功后,事务中所以的数据库操作比较持久化到数据库中。
事务的并发的问题
- 脏读:事务A读取了事务B未提交的更改数据,并在这个数据上进行了操作
- 不可重复读:一个事务范围内不同时间读取同一数据返回不同的值,因为在查询间隔中读取了其他事务对数据进行了修改提交。
- 幻读:更多的相对于表级别的的,A事务读取了B事务新增的数据,比如做统计是A事务2次统计之间B事务刚好新增了一条数据,这个时候就出现了幻读。
- 丢失更新A事务撤销覆盖了B事务的已经更新的数据,或者A事务提交覆盖了B事务已经提交的数据。丢失更新中事务隔离中是禁止的,了解即可。
事务隔离级别
- READ_UMCOMMITED:字面意思理解读未提交这种隔离级别是最低的运行脏读、不可重复读、幻读。
- READ_COMMITED:字面意思读已提交这种隔离级别级别不允许脏读、允许不可重复读和幻读
- REPEATABLE_READ:字面意思可重复读这种隔离级别不允许脏读、不可重复读,允许幻读。
- SERIALIZABLE:字面意思 可串行化的这种隔离基本最高都不允许。
默认一般是REPEATABLE_READ
Spring事务的传播
- PROPAGATION_REQUIRED:字面意思必须的当前方法必须运行中事务中,如果当前存在事务,则运行中该事务中,如果不存在,则会新起一个事务。
- PROPAGATION_SUPPORTS:字面意思支持表示该方法支持事务,如果当前存在事务,则运行中该事务中,如果不存在则以非事务的方法运行。
- PROPAGATION_MANDATORY:字面意思强制的表示该方法必须存在于事务中,如果不存在事务则会抛出异常。
- PROPAGATION_NOT_SUPPORTED:字面意思不支持表示该方法不支持事务,如果当前存在事务,事务将会被挂起
- PROPAGATION_REQUIRED_NEW:字面意思必须新的表示该方法必须运行中新的事务中,如果当前存在事务,该事务将会被挂起。
- PROPAGATION_NESTED:字面意思嵌套的表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。
- PROPAGATION_NEVER:字面意思永不表示该方法不支持事务,如果当前存在事务,则会抛出异常