查缺补漏之Spring事务

参考资料:https://yq.aliyun.com/articles/48893
简单总结:
事务:一组操作的集合,这组操作集合具有原子性,要么都成功,要么都失败.

事务控制不当可能导致的问题:
脏读:事务A在未提交之前,事务B读取到数据,随后事务A回滚,导致事务B中读取的数据有误.
不可重复读:事务A中重复读取一条记录,由于两次读取间隔中,事务B修改了数据,导致事务A两次读取的结果不一致.
幻读:事务A重复读取一张表中的数据,由于两次读取间隔中,事务B添加或者删除了数据,导致事务A两次读取的结果不一致.

事务隔离级别:
READ_UNCOMMITED:性能最好,但是会导致脏读,不可重复读,幻读.
READ_COMMITED:解决脏读,但是会导致不可重复读,幻读.(锁住当前行)
REPEATABLE_READ:解决脏读,不可重复读,但是会导致幻读.(锁住读取过的行)
SERIALIZABLE:能解决脏读,不可重复读,幻读,但是性能低下.(锁表)

MySQL默认的事务隔离级别是REPEATABLE_READ.
Oracle、SQLServer默认的事务隔离级别是READ_COMMITED.

事务传播行为:
Java中的方法总是存在各种调用或者被调用的关系的,在实际使用中应当根据具体的场景设置不同事务传播行为.
PROPAGATION_REQUIRED:默认值,如果上下文已经存在事务,则加入事务,否则开启新的事务.
PROPAGATION_SUPPORTS:如果上下文已经存在事务,则加入事务,否则以非事务的方式执行.
PROPAGATION_MANDOTORY:如果上下文已经存在事务,则加入事务,否则抛出异常.
PROPAGATION_REQUIRES_NEW:总会开启新的事务,且将原来上下文事务挂起(如果存在的话).
PROPAGATION_NOT_SUPPORTED:不支持事务,且将原来上下文事务挂起(如果存在的话).
PROPAGATION_NEVER:不支持事务,如果上下文存在事务则抛出异常.
PROPAGATION_NESTED:如果存在活动事务,则嵌套一个子事务,否则按照默认值PROPAGATION_REQUIRED执行.
需要注意的是嵌套:在开启子事务前保存一个回滚点,如果子事务的回滚或者提交不影响父事务,父事务的提交不影响子事务,父事务的回滚同时回滚子事务.
更多的使用场景建议参考:https://yq.aliyun.com/articles/48893

猜你喜欢

转载自blog.csdn.net/just_fight_/article/details/80269338