`

spring事务+mysql事务分类

 
阅读更多

数据库的悲观锁、乐观锁:

悲观(一锁二查三更新):可通过select * from ... for update实现;不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项而会阻塞。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁:可通过表增加字段version或字段时间戳实现,即更新时where带上原版本号。

 

一、Propagation (事务的传播属性) 

Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。默认的。

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

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

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

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

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

 

1: PROPAGATION_REQUIRED

加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务

比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候,

ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA

的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。

这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被

提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚

 

2: PROPAGATION_SUPPORTS

如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行

 

 

3: PROPAGATION_MANDATORY

必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常

 

4: PROPAGATION_REQUIRES_NEW

这个就比较绕口了。 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,

那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后,

他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在

两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚,

如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。

 

5: PROPAGATION_NOT_SUPPORTED

当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,

那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。

 

6: PROPAGATION_NEVER

不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,

那么ServiceB.methodB就要抛出异常了。

 

7: PROPAGATION_NESTED

理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,

而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。

而Nested事务的好处是他有一个savepoint。

 

 

Spring事务的隔离级别

 1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应

 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

 3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据

 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

 5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

 

什么是脏数据,脏读,不可重复读,幻觉读?

 脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。

    

 不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

            

 幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么之后操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

 

 

mysql的事务隔离级别(4个):

其中,MySQL的默认事务隔离级别是:Repeatable Read

但大多数的数据库系统的默认事务隔离级别是:Read committed



 

 

 

  • 大小: 51.5 KB
分享到:
评论

相关推荐

    spring mvc+spring+hibernate+bootstrap+mysql 考勤及薪酬管理系统

    《基于Spring MVC+Spring+Hibernate+Bootstrap+MySQL的考勤及薪酬管理系统详解》 在现代企业信息化管理中,考勤和薪酬管理是至关重要的部分,它们直接影响到员工的工作积极性和公司的运营效率。本文将深入探讨一个...

    SpringBatch+Spring+Mybatis+MySql (spring batch 使用jar)

    Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。 业务方案: 1、批处理定期提交。 2、并行批处理:并行处理工作。 3、...

    maven+spring MVC+Mybatis+jetty+mysql

    此外,Spring MVC 可以与Spring框架的其他模块无缝集成,如依赖注入、事务管理等。 3. Mybatis: Mybatis 是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的JDBC代码和...

    struts2+spring+ibatis+mysql

    Spring的IOC允许开发者将对象的创建和管理交给容器,AOP则允许在不修改原有代码的情况下添加新的功能,如日志记录、事务管理。此外,Spring还包含了数据访问、Web、测试等多个模块,能与Struts2无缝集成。 3. **...

    Struts2+Spring+Hibernate+Jsp+Mysql5 项目申报系统.zip

    在本项目中,Spring作为业务层的核心,负责管理对象的生命周期和依赖关系,同时可以实现事务管理、数据访问抽象以及服务层的实现。 3. **Hibernate**:Hibernate是一个流行的Java ORM(对象关系映射)工具,它简化...

    项目搭建实例、spring + mybatis + spring mvc + maven + mysql

    在本项目中,我们主要探讨的是一个基于Java的Web应用架构,它采用了Spring、MyBatis、Spring MVC、Maven以及MySQL这五大技术组件。这是一个经典的后端开发框架组合,适用于构建复杂、可扩展的企业级应用程序。下面将...

    综合spring mvc + spring + hibernate + bootstrap开发图书管理系统

    此外,Spring还提供了数据访问、事务管理、安全性等众多模块,方便整合其他技术和框架。 **Hibernate** 是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,允许开发者使用面向对象的方式处理数据库...

    SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip

    在本项目"SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip"中,开发者使用了SpringMVC4作为表现层,Spring4作为控制层和服务层,Hibernate4作为持久层,c3p0作为数据库连接池,以及MySQL作为数据库。...

    SSH+Spring Security+MySQL

    Spring框架则是一个全面的企业级应用框架,涵盖了依赖注入、事务管理、AOP(面向切面编程)、DAO(数据访问对象)支持等功能。Hibernate作为ORM(对象关系映射)工具,使得Java对象可以直接操作数据库,简化了数据库...

    Spring+Mybatis+Mysql项目框架

    1. **Spring框架**:Spring是一个开源的Java平台,它为开发人员提供了全面的应用程序框架服务,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。Spring的核心特性可以用来创建轻量级、松耦合的Java应用程序。...

    spring mvc+spring+hibernaate+bootstrap+maven通用后台部门员工管理系统.zip

    此外,Spring还包含了对数据库访问、事务管理、任务调度等多个方面的支持,是一个全面的开发框架。 3. **Hibernate**: Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。通过...

    spring3.0+hibernate3.3+mysql8.0

    在本项目中,我们关注的是一个经典的Java Web开发技术栈:Spring 3.0、Hibernate 3.3以及MySQL 8.0的整合。这个组合是企业级应用中常见的技术选型,它们各自承担着不同的职责,共同构建了一个强大、灵活且可扩展的...

    微服务分布式 springcloud+seata+nacos+mysql8

    综上所述,"微服务分布式 springcloud+seata+nacos+mysql8"的学习涉及了构建高可用、可扩展的微服务架构所需的核心技术,包括服务治理、分布式事务处理、配置中心和数据库管理。这些技术的掌握对于理解和实施微服务...

    Spring mvc+hibernate+mysql Demo

    【Spring MVC + Hibernate + MySQL 整合详解】 在IT领域,Spring MVC、Hibernate和MySQL是构建Web应用程序的常用技术栈。Spring MVC作为Spring框架的一部分,提供了强大的MVC(Model-View-Controller)架构,用于...

    spring mvc+ibatiS+mysql代码

    【Spring MVC + iBATIS + MySQL 整合详解】 Spring MVC 是一款强大的MVC框架,它使得Java开发者能够轻松地构建基于HTTP请求的Web应用程序。iBATIS 是一个优秀的持久层框架,它允许开发者将SQL语句直接写入XML配置...

    Maven + spring + mybatis + mysql + 事务管理

    在企业级Java开发中,"Maven + Spring + MyBatis + MySQL + 事务管理"是一个常见的技术栈组合,它们各自扮演着不同的角色,构建出高效、稳定的后端系统。 **Maven** 是一个项目管理和综合工具,它帮助开发者管理...

    HR人事管理系统 spring mvc + spring + hibernate + bootstrap + mysql

    Spring还提供了事务管理、数据访问抽象、远程服务支持等功能,极大地简化了Java应用程序的开发。 Hibernate作为ORM(对象关系映射)框架,负责将Java对象与数据库中的表进行映射,减少了SQL的编写工作。开发者可以...

    jdbc+spring+mysql事务理解和分析

    以下是对`jdbc+spring+mysql事务理解和分析`的详细说明: 1. **原子性(Atomicity)**:这是事务的基本特性,表示事务中的所有操作要么全部成功,要么全部回滚。如果在事务执行过程中发生错误,数据库会撤销所有已...

    mybatis+spring3+mysql整合的webservice的service

    【标题】"mybatis+spring3+mysql整合的webservice的service"涉及到的是将MyBatis、Spring3和MySQL数据库集成在一起,构建一个基于CXF框架的Web服务。这是一个常见的企业级应用架构,用于实现数据持久化、业务逻辑...

    spring+hibernate+http+mysql jar包

    MySQL支持SQL标准,可以创建表、执行查询、事务处理以及备份和恢复数据。 从"基本就不需要其他的jar包了"这句话我们可以推断,这个jar包集合可能包含了运行基于Spring、Hibernate和MySQL的Web应用程序所需的基本...

Global site tag (gtag.js) - Google Analytics