Spring-白话事物
什么是事物,把一组逻辑放在一起作为一个单元来提交执行,这就是事物,这不是定义,大概是这么个意思
如果你留心的话,你会看到到处都有事物,到处都会提到ACID四个特性(原子性,一致性,隔离性,持久性)
Redis的设计,Mysql的设计,Spring的设计,许许多多都有,并且也都是围绕着这4个特性展开,简单看下:
原子性(atomicity):要么一起成功,要么一起失败,通俗点你可以把他们看成一句代码在执行。。
一致性(consistency):执行前后数据的完整性保持一致
隔离性(isolation):正在执行的这个事物不会受到隔壁事物的干扰
持久性(durability):事物结束,数据就持久到数据库
以上Redis和Mysql的InnoDB存储引擎完美的支持事物(但是注意Mysql的Myisam引擎是不支持的,Redis支持事物,
但并不支持回滚)
由于Spring的事物支持和Mysql息息相关,下面我们关注下Mysql事物的几种隔离级别:
我们先来一个RR,这是使用最多的,也是Mysql的默认设置,RR就是Repeatable Read,可重复读,也就是多次读取结果
一致,什么情况会不一致呢,read uncommitted,望文生义就是读到未提交的,也就是脏读(程序中的说法),Mysql叫
未提交读,什么时候会出现脏读?现在开发一般很少出现,但是,但是,笔者曾经制造过一次,很久才反应过来,这真的
是人为制造的,那个需求是更新同一条记录的count字段+1造成的,这个接口的逻辑有点长,先select读取这条记录,一系
列的判断后决定是否update count加1,最终在某些情况下造成了一个死锁。测试并发情况下还是必现的。有兴趣的可以打开
两个mysql命令行窗口模拟下,首先将autocommited设置为0,不自动提交事务,然后窗口1下执行select记录A,窗口2下执行
select记录A,窗口1接着执行update A,窗口B执行update A,这个时候很关键了,窗口1事物commit,窗口2事物commit
接着你会收到一个超时的死锁提示,这个不细讲了。这里其实出现了一个问题,窗口2的select应该在窗口1update执行完毕之
后才能执行,这才能保证读到的数据不是在脏数据。至于read commited,提交读,很明显,可以避免脏读,但是接着再重复读
的话和先前的结果就不一致了,所以无法避免重复读的问题,最后一个serializable最霸气,序列化,大家谁也别抢,谁也别争
一个个来,解决了脏读,重复读等一系列问题,它叫序列化,和很多设计一样,优势带来的必然就有劣势,这个劣势很明显,
看名字序列化,效率很低下。
白话了这么多,首先告诉你,Spring的默认事物隔离级别跟数据库是保持一致的。接着看
在Spring中如果不考虑隔离级别,我们可能遇到下面几种情况
读到另一事物未提交的数据
读到另一事物已提交的insert的数据,导致多次查询结果不一致
读到另一事务已经提交的 update 的数据导致多次查询结果不一致
我们分别叫他们脏读,幻读,不可重复读
为了解决读这个问题,Spring设置了5种事物隔离级别
对了你没看错,上面那一长段介绍的mysql的4种情况,加上一个默认情况(数据库默认隔离级别),对应的参数名就是isolation
对应可取参数值为TransactionDefinition.ISOLATION_DEFAULT,TransactionDefinition.ISOLATION_REPEATABLE_READ,其他
的几个参数值类似,不再列举
最后我们看下7种传播行为
事物的传播行为描述的是当某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
给一个直观的代码片段:
public void methodA(){
methodB();
//doSomething
} @Transaction(Propagation=XXX)
public void methodB(){
//doSomething
}
传播行为在事物中占比较重的地位,主要是定义了外围方法在开启事物和未开启事务2种情况下嵌套内
部事物时,关于异常回滚的规则,因此笔者准备开一篇新的随笔贴出实践的代码和分析结果,这里在分
析业务的时候一定注意这么几点:
1、谁调用谁?比如方法a()中调用方法b()
2、a是否在一个开启的事物中
3、a和b抛出异常时,业务要求如何回滚?
4、按照Spring的事物传播行为来配置,测试是否满足对应业务场景
Spring-白话事物的更多相关文章
- spring的事物实现
Spring的事物主要有三个接口 PlatformTransactionManager. 根据TransactionDefinition配置的事物信息创建事物 TransactionDefinitio ...
- Spring定义事物通知tx:advice
<aop:config proxy-target-class="false"> <aop:advisor advice-ref="txAdvice ...
- Spring管理事物两种方式
Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...
- Spring @Transactional事物配置无效原因
spring @transaction不起作用,Spring事物注意事项 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方 ...
- 第6章 Spring的事物处理
一.简述事物处理 1.事物处理的基本概念 1)提交:所有操作步骤都被完整执行后,称该事物被提交 2)回滚:某步操作执行失败,所有操作都没被提交,则事物必须被回滚 2.事物处理的特性(ACID) 1)原 ...
- 解惑spring嵌套事物
工作中一直对spring中的事物管理都是最简单的配置 但是spring中的事物传播性配置 还有很多种,有时候经常疑惑service调用service的问题,今天的论坛上看到一篇写的非常详细的文字.记录 ...
- [原创]java WEB学习笔记109:Spring学习---spring中事物管理
博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...
- SSM-Spring-21:Spring中事物的使用案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...
- 转:Spring中事物管理
1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...
- Spring的事物传播行为
事物的传播属性:当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行(REQUIRED), 也可能开启一个新事务, 并在自己的事务中运行(Require ...
随机推荐
- mysql连接数问题备份
一. max_connections 这是是查询数据库当前设置的最大连接数 mysql> show variables like '%max_connections%';+----------- ...
- mysql 复制原理详解
http://www.cnblogs.com/kristain/articles/4142970.html
- 【JZOJ6389】小w学图论
description 小w这学期选了门图论课,他在学习点着色的知识.他现在得到了一张无向图,并希望在这张图上使用最多n种颜色给每个节点染色,使得任意一条边关联的两个节点颜色不同. 小w获得一张n个节 ...
- 【JZOJ6378】小w与数字游戏(game)
description analysis 对于\(n\)很大,一眼看出来肯定有两个相等的数减出来是\(0\),答案肯定是\(0\) 其实只要\(n>7\),由于斐波那契数列,肯定能有几个数的和减 ...
- C++——虚析构
目的: //只执行了 父类的析构函数//向通过父类指针 把 所有的子类对象的析构函数 都执行一遍//向通过父类指针 释放所有的子类资源 方法:在父类的析构函数前+virtual关键字 #define ...
- day24 面向对象设计part1
#!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...
- 《DSP using MATLAB》Problem 8.41
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- js中一个标签在按顺序执行没有被读取到时可以用window.onload
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <!DOCTYPE html PUBLIC " ...
- idea激活破解
下载链接:https://pan.baidu.com/s/1BADk1MCm0YxtB6zoX0DivA 提取码 ze9m将破解补丁放到bin文件中jetbrains-all.jar 在这俩个文件最后 ...
- Django的日常-模型层(1)
目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...