通俗点讲就是:

编程式事务就是自己写Try catch语句调用commit\rollback等函数来实现那段业务数据改变的事务性。 声明式事务:是通过框架和事务定义配置给自己的业务代码添加事务性,比如Spring里面的AOP。 前者需要自己写大量重复的事务控制代码,后者通过设置可以一次性给所有的业务方法添加上事务特性,@Transaction注解的方式。

使用方法(声明式)

 1.添加tx名字空间

xmlns:tx="http://www.springframework.org/schema/tx"

2.配置xml开启事务控制

<!-- 开启事务控制的注解支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

3.MyBatis自动参与到spring事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" />  <property name="configLocation">  <value>classpath:mybatis-config.xml</value>  </property>
</bean>
​
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="dataSource" />
</bean> 

使用@Transactional注解

@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该注解来覆盖类级别的定义。

虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

事物的特性(ACID)

1、原子性:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做,,不可能只执行其中的一部分操作。

2、一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。

3、隔离性:一个事务的执行不能被其他事务干扰。

4、持久性:指一个事务一旦提交,它对数据库中数据进行持久化处理。

事物的隔离级别

Read uncommitted(读未提交) 如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据,解决了更新丢失,但还是可能会出现脏读

Read committed(读提交) 如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。解决了更新丢失和脏读问题

Repeatable read(可重复读取) 可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。解决了更新丢失、脏读、不可重复读、但是还会出现幻读

Serializable(可序化) 提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读.解决了更新丢失、脏读、不可重复读、幻读(虚读)

事物的并发问题

脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么 A读取到的数据是脏数据

不可重复读:一个事务中两次(不同时间点)读取同一行数据,但是这两次读取到的数据不一致

幻读:事务A读取数据时,未把事务B新增的数据读取到,像产生了幻觉一样

丢失更新:事务A覆盖了事务B已提交更新的数据,导致事务B的更新数据好像丢失了一样

事务的传播特性

REQUIRED(required):默认的传播特性,业务方法需要在一个事务中运行,如果一个方法已经处在一个事务中那么就加入到这个事务中,否则就会创建一个事务。

NEVER(never): 指定的业务方法绝对不能在事务范围内运行,如果业务方法在某个事务中执行,就会抛异常,只有业务方法没有任何事务才正常执行

MANDATORY(mandatory):该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能自己发起自己的事务,如果业务方法不存在事务,容器就抛异常。

SUPPORTS(supports):如果业务方法中已经在某个事务中被调用,则方法就称为事务的一部分,如果外部业务方法没有开启事务,supports该方法也会在没有事务的环境中执行。

NOT_SUPPORTED(not_supported):如果该业务方法在一个事务中被调用,那么当前的事务会被挂起,执行该业务方法,方法执行完毕唤醒被挂起的事务,如果业务方法不在一个事务中执行,该方法也不会开事务。不管是否在有无事务的环境中执行都不开启事务。

REQUIRES_NEW(requires_new):不管是否存在事务,业务方法总会自己开启一个事务,如果在已有事务的环境中调用,已有事务会被挂起,新的事务会被创建,直到业务方法调用结束,已有事务才被唤醒

NESTED(nested):如果业务方法在一个事务中执行,就在这个事务中嵌套,如果没有事务按着required执行,开启单独的事务,这种事务有多个事务的保存点,内部事务的回滚对外部事务没有影响

编程式事务与声明式事务的区别相关推荐

  1. Spring事务处理之 编程式事务 和 声明式事务

    对事务概念还不了解的可以先看一下 MySQL事务管理(初步了解) 这篇文章 !!! Spring事务管理学习步骤: 1.掌握Spring事务属性 2.掌握Spring事务核心API 3.掌握Sprin ...

  2. Spring中的编程式事务与声明式事务

    目录 编程式事务 使用TransactionTamplate 使用TransactionManager 声明式事务 XML文件配置 java代码配置---@transactional 编程式事务 通过 ...

  3. spring中编程式事务与声明式事务

    spring中使用事务有两种方式,一种是编程式,一种是声明式. 编程式事务 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManage ...

  4. 事务声明声明式事务和编程式事务区别

    事务声明声明式事务和编程式事务区别 1.编程式事务: 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理.管理使用TransactionTemplate或者直接使用底层的Pla ...

  5. 编程式事务与声明式事务

    编程式事务 1.加入jar包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar co ...

  6. spring 的4种事务管理(1种编程式+3种声明式)

    见:http://blog.csdn.net/sinat_25926481/article/details/48208619 Spring的4种事务管理(1种编程式事务+三种声明事务) 一.Sprin ...

  7. 事务(注解声明式事务管理)

    1.什么事务 (1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 2.事务四个特性(ACID) (1)原子性 (2)一致性 (3)隔离性 (4)持久性 1.原子 ...

  8. Spring事务管理--声明式事务管理

    Spring的事务管理分为两种方式:1,传统的编程式事务管理(编码式事务管理):2,声明式事务管理. Spring的声明式事务管理是指将事务管理代码从业务方法中分离出来,以申明的方式实现事务管理.Sp ...

  9. 声明式事务java_Spring声明式事务管理源码解读之事务开始

    首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的.有这样一个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口TransactionAttrib ...

最新文章

  1. 怎么把线稿提取出来_抠线稿,三种提取漫画线稿的方式
  2. 四则运算-ppt演示
  3. Java并发编程(8):多线程环境中安全使用集合API(含代码)
  4. oracle 如何数组变成表,Oracle从零开始19——表的管理09——嵌套表和可变数组
  5. 实时光线追踪技术:业界发展近况与未来挑战
  6. Docker---问题1:bash: vi: command not found/bash: vim: command not found
  7. Redis数据库-键的生存时间与过期时间的区别
  8. 基于深度强化学习的路径规划笔记
  9. 最佳75个安全工具介绍及其下载地址
  10. (云安全)拖库-洗库-撞库
  11. 两款强大的PC优化工具推荐,CleanMyPc与Memreduct
  12. html页面嵌入百度地图
  13. 去不去 Google ?Ex-Googler 讲述他的职业选择
  14. Android 绘制简单的折线图
  15. TMS320C6748_ECAP_APWM
  16. 图片旋转90度解决办法
  17. python使用keyboard库写的GUI键盘宏
  18. 瑞萨单片机CS+ for CC 与Renesas Flash Programme软件的使用-学习记录
  19. Ubuntu 下旋转显示器屏幕
  20. 【云栖大会】菜鸟网络CTO王文彬:智慧互联 重构物流

热门文章

  1. 二次元属性被稀释,B站还剩什么?(下篇)
  2. java中字符和字节的区别是什么?
  3. iOS Autolayout笔记
  4. 【踩坑】深度学习 Torch 爆显存的原因(显存不够用等问题)
  5. SQL两张表或者多表连接查询
  6. 我让小屋更漂亮计算机教案,小班美术活动漂亮的房屋教案反思
  7. 元素方尖服务器维护,元素方尖公测版
  8. DWORD *类型的实参与SIZE_T *类型的形参不兼容,求指教
  9. 我们自己的十二生肖,就要我们自己的卡通形象
  10. 位运算对字母大小写的转换