事务、Spring的事务、4种事务特性、4中隔离级别、传播行为

           一、事务概念
                指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。
            二、Spring事务
                Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:
                    1.获取连接 Connection con = DriverManager.getConnection()
                    2.开启事务con.setAutoCommit(true/false);
                    3.执行CRUD
                    4.提交事务/回滚事务 con.commit() / con.rollback();
                    5.关闭连接 conn.close();
                使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。
            三、spring事务的实现方式
                    1.编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
                    2.基于 TransactionProxyFactoryBean的声明式事务管理
                    3.基于 @Transactional 的声明式事务管理
                    4.基于Aspectj AOP配置事务
            四、事务的特性
                1.原子性:事物是数据库的逻辑工作单位,事物中包括得诸操作要么都做,要么都不做。
                2.一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
                3.隔离性:一个事务的执行不能被其它事物干扰。即一个事物内部的操作及使用的数据对
                其它并发事物是隔离的,并发执行的各个事物之间不能互相烦扰。
                4.持续性:也称永久性,只一个事物一旦提交,它对数据库中数据的改变就应该是永久性
                的。接下来的其它操作或故障不应该对其执行结果有任何影响。
            五、因数据库隔离级别不同出现的问题
                1.脏读 :一个事务读到了另一个事务的未提交的数据 
                2.不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致. 
                3.虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.
            六、Spring的隔离级别与数据库相同
                1.未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生 
                2.已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生 
                3.可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生. 
                4.串行化的 (serializable) :避免以上所有读问题.             
                注:常用数据库事务默认:Mysql 默认:可重复读 、Oracle 默认:读已提交            
            七、事务的传播行为 
                * 保证同一个事务中 
                1.PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认) (required)
                2.PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务 (supports)
                3.PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常 (mandatory)
                * 保证没有在同一个事务中 
                4.PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务 (requires_new)
                5.PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务 (not_supported)
                6.PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常 (never)
                7.PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行(nested)

猜你喜欢

转载自blog.csdn.net/qq_40280705/article/details/82014718