东莞企业网站价格,龙口市最新公告,服饰团购网站建设,wordpress图片粘贴插件一、事务的ACID特性 原子性#xff08;Atomicity#xff09; 原子性是指事务是一个不可分割的工作单位#xff0c;事务中的操作要么都发生#xff0c;要么都不发生。一致性#xff08;Consistency#xff09; 事务前后数据的完整性必须保持一致。隔离性#xff08;Isola…一、事务的ACID特性 原子性Atomicity 原子性是指事务是一个不可分割的工作单位事务中的操作要么都发生要么都不发生。一致性Consistency 事务前后数据的完整性必须保持一致。隔离性Isolation 事务的隔离性是多个用户并发访问数据库时数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰多个并发事务之间要相互隔离。持久性Durability 持久性是指一个事务一旦被提交它对数据库中数据的改变就是永久性的接下来即使数据库发生故障也不应该对其有任何影响。
二、事务可能存在的问题 1、脏读
读到其他事务未提交的数据或已回滚的脏数据。
2、不可重复读
事务A读取一条数据然后执行业务逻辑的时候事务B将这条数据修改了导致A再次读取这条数据时发现数据不匹配了。
3、幻读 事务A根据条件索引得到N条数据然后事务B改变了这N条数据之外的M条数据或增加了M条数据使得符合事务A的检索条件导致事务A再次检索时发现了NM条数据产生了幻觉一样。
三、MySQL的事务隔离级别 1、READ_UNCOMMITTED 读未提交
也叫未提交读该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据而未提交的数据可能会发生回滚因此我们把该级别读取到的数据称之为脏数据把这个问题称之为脏读2、READ_COMMITTED 读已提交
也叫提交读该隔离级别的事务能读取到已经提交事务的数据因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果所以在不同时间的相同 SQL 查询中可能会得到不同的结果这种现象叫做不可重复读3、REPEATABLE_READ 可重复读 mysql默认隔离级别
它能确保同一事务多次查询的结果一致。但也会有新的问题比如此级别的事务正在执行时另一个事务成功的插入了某条数据但因为它每次查询的结果都是一样的所以会导致查询不到这条数据自己重复插入时又失败因为唯一约束的原因。明明在事务中查询不到这条信息但自己就是插入不进去这就叫幻读 Phantom Read4、SERIALIZABLE 串行化
最高的事务隔离级别它会强制事务排序使之不会发生冲突从而解决了脏读、不可重复读和幻读问题但因为执行效率低所以真正使用的场景并不多 四、spring事务的隔离级别 spring的的事务隔离级别与mysql一致多了一个默认隔离级别
DEFAULTSpring 中默认的事务隔离级别 以连接的数据库的事务隔离级别为准。
当mysql和spring都配置了事务的隔离级别时以spring配置为准。 五、spring事务的传播机制 传播行为描述方法B定义的事务类型A方法有事务A方法无事务REQUIRED默认的传播特性如果当前没有事务则新建一个事务如果当前存在事务则加入当前事务。Transactional(propagation Propagation.REQUIRED) AB合成一个事务B新建事务SUPPORTS当前存在事务则加当前事务当前没有事务则以非事务方式执行。Transactional(propagation Propagation.SUPPORTS)B加入到A的事务中B无事务MANDATORY当前存在事务则加入当前事务如果当前没有事务则抛出异常。Transactional(propagation Propagation.MANDATORY)B加入到A的事务中B抛异常REQUIRES_NEW创建一个新事务如果当前有事务则挂起当前事务。Transactional(propagation Propagation.REQUIRES_NEW)B新建一个自己的事务与A隔离B新建事务NOT_SUPPORTS以非事务方式执行如果当前存在事务则挂起事务。Transactional(propagation Propagation.NOT_SUPPORTS)挂起A事务B以无事务方式执行B无事务NEVER不使用事务如果当前有事务则抛出异常。Transactional(propagation Propagation.NEVER)B抛异常B无事务NESTED如果当前有事务则嵌套在当前事务中执行否则新建一个事务。Transactional(propagation Propagation.NESTED)B新建一个A的子事务受A影响但不影响AB新建事务
六、spring事务的失效场景 1、bean对象没有被spring容器管理
2、方法的访问修饰符不是public
3、数据库不支持事务
4、数据源没有配置事务管理器
5、同类中无事务方法调用有事务方法
6、异常被捕获
7、异常类型错误或配置错误传播类型不支持事务