事务的四大特性:
原子性:事务不可分割
一致性:事务执行前后数据完整性保持一致
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:一旦事务结束,数据就持久化到数据库
如果不考虑隔离性引发安全问题
读问题
脏读:一个事务读取到另一个事物未提交的数据.
不可重复读:一个事务读取到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致.
虚读、幻读:一个事务读取到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致.
写问题
丢失更新
解决读问题
#设置事务的隔离级别
1.读未提交(Read uncommitted) :会产生脏读问题,在项目中不用, 安全性太差;
2.读提交(Read commited):解决了脏读,但是不可重复读和虚读有可能发生;(oracle默认隔离级别)
3.可重复读(Repeatable read):解决了脏读和不可重复读,但是虚读有可能发生; (mysql默认隔离级别)
4.可串行化(Serializable):解决所有读问题.非常安全但是效率非常低.
spring的事务的传播行为
如果遇到了特别复杂的业务逻辑,有可能会出现业务层之间的方法相互调用。
*事务的传播行为主要用来解决业务层方法相互调用的问题。
#保证多个操作在同一个事务中
1.PROPAGATION_REQUIRED : 默认值.如果A中有事务,使用A中的事务,如果A中没有事务,则创建一个新的事务,将操作包含进来.
2.PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务;如果A没有事务则不使用事务.
3.PROPAGATION_MANDATORY : 如果A中有事务,使用A中的事务;如果A没有事务则抛出异常.
#保证多个操作不在同一个事务中
1.PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建一个新的事务,只包含自身的操作。如果A中没有事务,创建一个新的事务,包含自身操作。
2.PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起,不使用事务管理
3.PROPAGATION_NEVER :如果A中有事务,报异常。
#嵌套式事务
1.PROPAGATION_NESTED :嵌套事务,如果A中有事务,则按照A中的事务执行,执行完毕后设置一个保存点,执行B中的操作,如果没有异常,执行通过;如果有异常,到保存点。