事务一般是指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么完全执行,要么完全不执行。事务就是判断以结果为导向的标准。

一.spring的特性(ACID)

(1).原子性(atomicity)
       原子性就是一个不可分割的工作单元。简单的说,就是指事务包含的所有操作要么全部成功,要么全部失败回滚。因此事务的操作如果成功就必须要完全应用到数据库,如果失败则不能对数据库有任何影响。
    (2).一致性(consistency)
     一致性就是事务必须是使一个一致性状态变成另一个状态,也就是说一个书屋执行之前和执行之后都必须处于一致性状态。那转账来说,假设用户A和用户B两者的钱加起来一共是5000.那么不管A和B之间如何转账,转多少次,事务结束后两者的钱加起来还是5000。
    (3).隔离性(isolation)
     隔离性就是一个事务的执行不能被另一个事务干扰。当多个用户并发访问数据库操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,并发事务之间要相互隔离。
  (4).持久性(durability)
      持久性是指一个事务一旦被提交了,那么对数据库数据的改变就是永久的。即使是在数据系统遇到故障的情况下也不会丢失提交事务的操作。

二.spring的隔离级别

* 脏读:一个事务读到了另一个事务未提交的数据
* 不可重复读:一个事务读到另一个事务已经提交(update)的数据导致多次查询结果不一致
* 虚幻读:一个事务读到了另一个事务已经提交(insert)的数据导致多次查询结果不一致。

对于sqlserver和oracle的默认隔离级别是RC,mysql的默认隔离级别是RR。

三.spring的传播特性(事务有7中传播机制 )

对于spring的代码我有写过一个测试的小demo,在demo里面有记录如何添加的事务,同时也打印了日志记录最后结果,可以任意扩展。

由于博客园上传代码比较麻烦,我就上传到CSDN上的,想测试的可以去下载。

网址:https://download.csdn.net/download/zj520_/12064006

四.spring的注意事项

1. 出现Exception是无法回滚的,只有抛出RuntimeException和Error异常时才能回滚。 2. 在事务代码中捕获了异常,是无法进行回滚的。
3. 如果是使用的spring+mvc模式。并且spring和mvc都扫描了service层(事务处理层),事务不生效。因为spring会有限加载mvc的配置文件,而事务的配置基本上都是在spring中,因为spring的子容器先于父容器启动,造成在controller中注入service时还没有加载事务。
4. mysql的myISAM引擎,是不支持事务的,需要设置为innoDB模式。
5. 事务的开启必须放到listener里面加载,如果放到dispatchServlet的配置里面,事务不生效。
6. 如果在接口中使用@Transactional,只有JDK动态代理才能生效,CGLIB动态代理是不生效的,因为注解是不能继承的。

五.如果让Exception可以进行回滚呢?

方法1:@Transactional注解指定rollbackFor=Exception.class

方法2:让throw的自定义Exception继承RuntimeException

方法3:使用自定义注解,处理回滚Exception的问题:

@Transactional(rollbackFor=Exception.class)
public @interface DolTransactional {

}

最新文章

  1. react+redux官方实例TODO从最简单的入门(6)-- 完结
  2. 大白话讲解Promise(二)理解Promise规范
  3. C# foreach 中获取索引index的方法
  4. 拾取模型的原理及其在THREE.JS中的代码实现
  5. ABAP中的Table Control编程
  6. 安全框架 SpringSecurity 和 Shiro 对比
  7. 集群(cluster)原理(转)
  8. JSBinding + SharpKit / 生成JavaScript绑定
  9. 搭建Spring + SpringMVC + Mybatis框架之三(整合Spring、Mybatis和Spring MVC)
  10. 利用c#反射实现实体类生成以及数据获取与赋值
  11. csv文件与DataTable互相导入处理
  12. .NET程序保护专家.NET Reactor发布4.7版本
  13. 菜鸟帮你跳过openstack配置过程中的坑
  14. 如何让低版本IE浏览器支持HTML5标签并为其设置样式
  15. C++Primer学习——类型转换
  16. session和cookie的应用场景和区别
  17. 检测到目标URL存在http host头攻击漏洞
  18. 【Struts2】如何查看Struts2框架的源码
  19. 我也谈谈.NET程序员工资低
  20. 弹性盒子模型display:flex

热门文章

  1. kibana 开发工具介绍
  2. MYSQL---外键 primary key 作用
  3. component:(resolve) => require
  4. 温湿度传感器AM2302(DH22)
  5. 输入url到展示页面过程发生了什么?
  6. C/C++网络编程7——多进程服务器端之fork函数
  7. 1.ORM介绍,基本配置及通过ORM框架创建表
  8. 关于java自学的内容以及感受(7.28)
  9. nginx 的磁盘IO优化
  10. 【转】python装饰器