数据库事务

事务特性:

  1. 原子性,事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做
  2. 一致性,在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态
  3. 隔离性,并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性
  4. 持久性,事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会造成数据不一致或丢失

数据库常见问题:

  1. 脏读:一个事务看到了另一个事务未提交的更新数据
  2. 不可重复读:在同一事务中,多次读取同一数据却返回不同的结果;也就是有其他事务更改了这些数据
  3. 幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。

数据库隔离级

  1. 未提交读(RU Read Uncommitted):最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现脏读、不可重复读、幻读
  2. 提交读(RC Read Committed):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不会出现脏读,但可能出现不可重复读、幻读
  3. 可重复读(RR Repeatable Read):保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,不会出现脏读、不可重复读,但可能出现幻读;
  4. 序列化(Serializable):最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不会出现脏读、不可重复读、幻读。

Spring提供的事务管理

Spring框架最核心功能之一就是事务管理,Spring支持声明式事务和编程式事务事务类型,这能帮助我们:

  1. 提供一致的编程式事务管理API,不管使用Spring JDBC框架还是集成第三方框架使用该API进行事务编程;
  2. 无侵入式的声明式事务支持。

Spring框架支持事务管理的核心是事务管理器抽象,通过定义接口 PlatformTransactionManager 让不同数据访问框架来实现,

  1. public interface PlatformTransactionManager {
  2. TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
  3. void commit(TransactionStatus status) throws TransactionException;
  4. void rollback(TransactionStatus status) throws TransactionException;
  5. }

getTransaction():返回一个已经激活的事务或创建一个新的事务(根据给定的TransactionDefinition类型参数定义的事务属性),返回的是TransactionStatus对象代表了当前事务的状态,其中该方法抛出TransactionException(未检查异常)表示事务由于某种原因失败。

commit():用于提交TransactionStatus参数代表的事务

rollback():用于回滚TransactionStatus参数代表的事务

TransactionDefinition接口

  1. public interface TransactionDefinition {
  2. int getPropagationBehavior();
  3. int getIsolationLevel();
  4. int getTimeout();
  5. boolean isReadOnly();
  6. String getName();
  7. }

getPropagationBehavior():返回定义的事务传播行为;

getIsolationLevel():返回定义的事务隔离级别;

getTimeout():返回定义的事务超时时间;

isReadOnly():返回定义的事务是否是只读的;

getName():返回定义的事务名字。

事务传播行为

PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。

编程式事务

配置文件

  1. <bean id="dataSource" parent="dataSourceParent">
  2. <property name="url" value="jdbc:mysql://dbm.***.me:3306" />
  3. <property name="username" value="root" />
  4. <property name="password" value="123456" />
  5. </bean>
  6. <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  7. <property name="dataSource" ref="dataSource" />
  8. </bean>
  1. DefaultTransactionDefinition def = new DefaultTransactionDefinition();
  2. def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  3. def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
  4. TransactionStatus status = txManager.getTransaction(def);
  5. jdbcTemplate.execute(CREATE_TABLE_SQL);
  6. try {
  7. jdbcTemplate.update(INSERT_SQL, "test");
  8. txManager.commit(status); ![](http://images2015.cnblogs.com/blog/1071030/201706/1071030-20170608143321590-1214373007.png)
  9. } catch (RuntimeException e) {
  10. txManager.rollback(status);
  11. }

声明式事务

  1. <tx:advice id="txAdvice" transaction-manager="txManager">
  2. <tx:attributes>
  3. <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
  4. <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>
  5. </tx:attributes>
  6. </tx:advice>
  7. <aop:config>
  8. <aop:pointcut id="daoMethod" expression="execution(* com.dao.*.*(..))"/>
  9. <aop:advisor pointcut-ref="daoMethod" advice-ref="txadvice"/>
  10. </aop:config>

tx:advice:事务通知定义,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过tx:attributes指定具体需要拦截的方法;

aop:pointcut/:切入点定义 其中第一个代表返回值,第二代表dao下子包,第三个*代表方法名,“(..)”代表方法参数。

aop:advisor:Advisor定义,其中切入点为daoMethod,通知为txAdvice。

不能被事务增强的方法

Spring学习--Spring事务相关速记的更多相关文章

  1. Spring学习8-Spring事务管理

      http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html   Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...

  2. MySQL学习笔记-事务相关话题

    事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都 ...

  3. Spring学习之事务注解@Transactional

    今天学习spring中的事务注解,在学习Spring注解事务之前需要明白一些事务的基本概念: 事务:并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通 ...

  4. Spring学习8-Spring事务管理(编程式事务管理)

    一.Spring事务的相关知识   1.事务是指一系列独立的操作,但在概念上具有原子性. 比如转账:A账号-100, B账号+100,完成.这两个操作独立是没问题的. 但在逻辑上,要么全部完成,要么一 ...

  5. Spring 学习7 -事务

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  6. 【转】Spring学习---Spring 学习总结

    什么是Spring ? Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson在其著作Expert One-On-One J2EEDev ...

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

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

  8. Spring 学习——Spring框架结构、概念

    maven项目结构 记忆:在一个项目中,project下一层级时src,也就是源文件,所有需要进行编译的文件都是在这个目录下,其实也就是这一个目录,然后向下扩展.在src目录下,存在main文件夹,里 ...

  9. 【转】Spring学习---Spring IoC容器的核心原理

    [原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...

随机推荐

  1. Android拖动和缩放

    拖拽和缩放 多点触控的理论学完了之后,这里开始实践.本节主要介绍使用onTouchEvent()方法处理触控事件. 拖动一个对象 如果你使用的是Android 3.0或者之后的系统,那么你可以使用内置 ...

  2. io类型

    非阻塞io from socket import * import time s=socket(AF_INET,SOCK_STREAM) s.bind(('127.0.0.1',8080)) s.li ...

  3. MySQL中的数据约束

    什么是数据约束: 对用户操作表的数据进行约束 1.默认值: 作用:当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意:1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非nul ...

  4. noip第17课作业

    1.  召见骑士 [问题描述] 某王国有5位骑士,每位骑士都有自己的编号,且这个王国的编号都为奇数,分别为1,3,5,7,9,在国王召见他们之前他们都必须经过只能从一边进出的长廊,长廊的宽度只能坐一个 ...

  5. QT5.4.0安装以及与VS2010整合安装---64bit操作系统解决方案

    QT5.4.0安装以及与VS2010整合安装---64bit操作系统解决方案 注意,目前QT官网不能下载,必须提供注册,然后才可以下载. 网上不同版本安装的细节有差异,特将我的安装相关操作贴出来,希望 ...

  6. 初始Hive

    Hive 背景 引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一推MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 耗时耗力,更多精力没有有效 ...

  7. presto调研和json解析函数的使用

    presto简单介绍 presto是一个分布式的sql交互式查询引擎.可以达到hive查询效率的5到10倍.支持多种数据源的秒级查询. presto是基于内存查询的,这也是它为什么查询快的原因.除了基 ...

  8. python使用httplib2访问REST服务的例子

    首先你需要安装httplib2,这个可以在github上找到: 然后你需要获得一个http连接的对象: con = httplib2.Http()   然后你需要发起连接: (6)resp, (5)c ...

  9. 等到花儿也谢了的await

    async/task/await三组合是.NET Framework 4.5带给.NET开发者的大礼,合理地使用它,可以提高应用程序的吞吐能力. 但是它的使用有点绕人,如果不正确使用,会带来意想不到的 ...

  10. ASP.NET WebAPI (反)序列化用[SerializableAttribute]修饰的类的一个坑

    发现问题 在 ASP.NET WebAPI 项目中,有这样的 ViewModel 类: [Serializable] class Product { public int Id { get; set; ...