什么是事物,把一组逻辑放在一起作为一个单元来提交执行,这就是事物,这不是定义,大概是这么个意思

  如果你留心的话,你会看到到处都有事物,到处都会提到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-白话事物的更多相关文章

  1. spring的事物实现

    Spring的事物主要有三个接口 PlatformTransactionManager. 根据TransactionDefinition配置的事物信息创建事物 TransactionDefinitio ...

  2. Spring定义事物通知tx:advice

    <aop:config proxy-target-class="false">    <aop:advisor advice-ref="txAdvice ...

  3. Spring管理事物两种方式

    Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...

  4. Spring @Transactional事物配置无效原因

    spring @transaction不起作用,Spring事物注意事项 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方 ...

  5. 第6章 Spring的事物处理

    一.简述事物处理 1.事物处理的基本概念 1)提交:所有操作步骤都被完整执行后,称该事物被提交 2)回滚:某步操作执行失败,所有操作都没被提交,则事物必须被回滚 2.事物处理的特性(ACID) 1)原 ...

  6. 解惑spring嵌套事物

    工作中一直对spring中的事物管理都是最简单的配置 但是spring中的事物传播性配置 还有很多种,有时候经常疑惑service调用service的问题,今天的论坛上看到一篇写的非常详细的文字.记录 ...

  7. [原创]java WEB学习笔记109:Spring学习---spring中事物管理

    博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...

  8. SSM-Spring-21:Spring中事物的使用案例

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...

  9. 转:Spring中事物管理

    1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...

  10. Spring的事物传播行为

    事物的传播属性:当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行(REQUIRED), 也可能开启一个新事务, 并在自己的事务中运行(Require ...

随机推荐

  1. Linux下mysql实现远程连接

    首先明白一点并不是mysql禁止远程连接,而是MYSQL的账号禁止远程连接.可能觉得我有点咬文嚼字了,不过我感觉分清这点还是很重要的.默认情况下,所有账号都是禁止远程连接的.在安装MYSQL的时候,在 ...

  2. Flutter BottomNavigationBar切换会刷新当前页面解决方

    问题描述 BottomNavigationBar 是flutter 中最常用的UI组建,刚接触时发现在切换tab 的时候,会刷新当前的所有状态,每个页面都会重新刷新.于是乎,在这里先记录下解决方案. ...

  3. HttpWebRequest请求返回非200的时候 HttpWebResponse怎么接受返回错误提示

    当我们使用HttpWebRequest发送请求的时候如果服务器返回的不是200状态,那么请求代码肯定会异常,其实请求和返回并没有什么异常,只是.net内部就认定了 返回的不要是200 就是异常 那么我 ...

  4. 前端常用的库和实用技术之JavaScript高级函数

    1.惰性载入函数 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. Python学习笔记(三)——文件系统中的常用方法

    OS模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir() 改变工作目录 listdir(path='.') 列举指定目录中的文件名('.'表示当 ...

  6. AndroidStudio 搜索导入自己需要的库

    前言 在Androidx的库应用后,导致有需多系统组件库需要重新 implementation 升级为Androidx, 但是你可能会发现不知道怎么导入他们.  当然除了导入Android的组件库,还 ...

  7. K-Anonymous Sequence

    K-Anonymous Sequence 给出一个递增的长度为n的序列\(\{a_i\}\),现在你可以进行一次操作,选择若干个数,分别减少任意一个正整数,定义权值为这些正整数之和,询问操作使得新序列 ...

  8. webstorm安装与破解

    1.下载webstorm和补丁文件 链接:https://pan.baidu.com/s/1aiHxPExAbDCcHxKtB82_vg 提取码:jo07 链接:https://pan.baidu.c ...

  9. zabbix配置文件解析

    zabbix的配置文件一般有三种:zabbixserver的配置文件zabbix_server.confzabbixproxy的配置文件zabbix_proxy.confzabbix_agentd的配 ...

  10. 阿里云应用上边缘云解决方案助力互联网All in Cloud

    九月末的杭州因为一场云栖大会变得格外火热. 9月25日,吸引全球目光的2019杭州云栖大会如期开幕.20000平米的展区集结数百家企业,为数万名开发者带来了一场前沿科技的饕餮盛宴. 如同往年一样,位于 ...