`

spring 事务 mysql引擎

阅读更多

运行配置@Transactional注解的测试类的时候,具体会发生如下步骤
1)事务开始时,通过AOP机制,生成一个代理connection对象,并将其放入DataSource实例的某个与DataSourceTransactionManager相关的某处容器中。在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚]
2)事务结束时,回滚在第1步骤中得到的代理connection对象上执行的数据库命令,然后关闭该代理connection对象


根据上面所述,我们所使用的客户代码应该具有如下能力:
1)每次执行数据库命令的时候
如果在事务的上下文环境中,那么不直接创建新的connection对象,而是尝试从DataSource实例的某个与DataSourceTransactionManager相关的某处容器中获取connection对象;在非事务的上下文环境中,直接创建新的connection对象
2)每次执行完数据库命令的时候
如果在事务的上下文环境中,那么不直接关闭connection对象,因为在整个事务中都需要使用该connection对象,而只是释放本次数据库命令对该connection对象的持有;在非事务的上下文环境中,直接关闭该connection对象

 

 

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked

如果遇到checked意外就不回滚。

如何改变默认规则:

1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

4 如果不添加rollbackFor等属性,Spring碰到Unchecked Exceptions都会回滚,不仅是RuntimeException,也包括Error。

 

注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

 

数据库隔离级别

四个级别与四种现象的关系是:首先尽收眼底!!!

 

英文

中文

更新丢失

脏读

不可重复读

幻读

Read Uncommited 

读未提交

不会出现

会出现

会出现

会出现

Read Commited

读已提交

不会出现

不会出现

会出现

会出现

Repeatable Read

可重复读

不会出现

不会出现

不会出现

会出现

Serializable

串行化

不会出现

不会出现

不会出现

不会出现

 

Spring隔离级别

 
spring隔离级别 对应数据库隔离级别
 ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
ISOLATION_READ_UNCOMMITTED Read Uncommited
ISOLATION_READ_COMMITTED Read Commited
ISOLATION_REPEATABLE_READ Repeatable Read
ISOLATION_SERIALIZABLE Serializable

Read uncommitted 读未提交

脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。

 

当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。

 

Read committed 读提交

不可重复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

Repeatable read 重复读

当隔离级别设置为Repeatable read时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。

虽然Repeatable read避免了不可重复读,但还有可能出现幻读

singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction ... ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。

注:MySQL的默认隔离级别就是Repeatable read。

Serializable 序列化

Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

 

mysql数据库引擎

一般现在都用mysql,所以我只列出mysql的数据引擎一些基础!!!

 

MySQL数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。如果技术高超,还可以使用MySQL+API自己做一个引擎。下面介绍几种数据库引擎:

    ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到 数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不 支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实 时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
    MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
    HEAPHEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格
    InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者 或者两者,那你就要被迫使用后两个引擎中的一个了。
 
MyISAM与InnoDB的区别
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

普通事务的实现以jdbm3为例,大概是这样的过程:

每个事务都新建一个事务文件,当commit时,先把修改过的数据块,写到事务文件里,然后再一次性地写到数据库文件里。

如果commit时挂掉了,那么重启之后,会再次从事务文件里把修改过的块写到数据库文件里。最后再删除事务文件。

XA事务
分享到:
评论

相关推荐

    spring3.0+hibernate3.3+mysql8.0

    MySQL 8.0引入了诸多新特性,如窗口函数、JSON增强、InnoDB存储引擎的改进等。在与Spring和Hibernate整合时,需要正确配置MySQL的JDBC驱动(通常为`mysql-connector-java`),以便Spring的JdbcTemplate或Hibernate...

    spring+mysql学习.zip

    2. **存储引擎**:InnoDB是MySQL的主要存储引擎,支持事务处理和行级锁定,适合并发操作。MyISAM则适用于读取密集型应用,因为它提供了更快的读取速度。 3. **SQL支持**:MySQL支持标准SQL查询语言,可以执行复杂的...

    Spring + Ibatis 与mysql集群集成

    4. **事务管理**:由于MySQL集群支持分布式事务,Spring的声明式事务管理能够无缝地工作。只需在需要事务的Service层方法上添加@Transactional注解,Spring会自动管理事务的开始、提交或回滚。 5. **高可用性和负载...

    基于mysql,SpringBoot 分布式事务例子

    MySQL作为广泛使用的SQL数据库,虽然默认不支持分布式事务,但可以通过InnoDB存储引擎启用行级锁和事务支持。在SpringBoot中配置MySQL事务管理,我们通常会使用DataSourceTransactionManager,它适用于单数据库事务...

    Spring+Hibernate+Mysql简单搭建

    5. **配置Spring**:编写Spring的配置文件(如applicationContext.xml),声明数据源、SessionFactory以及事务管理器等。 6. **配置Hibernate**:在hibernate.cfg.xml文件中设置数据库连接信息,以及实体类到数据库...

    Spring+mysql读写分离

    2. **MySQL**:MySQL是一个广泛使用的开源关系型数据库管理系统,支持事务处理和多种存储引擎。在读写分离的场景下,我们通常会设置一个主库(Master)进行写操作,多个从库(Slaves)进行读操作。MySQL支持主从复制...

    spring-transaction-manager:Spring事务管理实现原理及MySQL InnoBD引擎行锁概述---配套代码

    本篇将深入探讨Spring事务管理的实现原理以及MySQL InnoDB引擎的行锁概念。 Spring事务管理是通过其核心接口`PlatformTransactionManager`来实现的,它定义了事务开始、提交、回滚和查询事务状态的方法。Spring提供...

    spring常用数据库事务传播属性和事务隔离级别1

    MySQL 的 InnoDB 引擎默认使用此级别。 5. **Isolation.SERIALIZABLE**:最高的隔离级别,完全避免了脏读、不可重复读和幻读,但性能最差,因为需要锁定事务涉及的所有行。 在实际应用中,开发者需要根据业务需求...

    Spring Boot学习 Spring Boot Spring MVC MyBatis MySQL Spring .zip

    MySQL支持SQL标准,具有事务处理、查询优化和多种存储引擎等功能。 Spring 框架是Java企业级应用开发的基石,它提供了全面的面向切面编程(AOP)支持,包括Java配置、XML配置和注解配置。Spring还包含了数据访问/...

    详细整理Spring事务失效的具体场景及解决方案.docx

    "Spring事务失效的具体场景及解决方案详细整理" 在实际项目开发中,为了保证业务数据的一致性,大家一般都会采用事务机制。但是,很多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手。下面我们将...

    spring mvc + mybatis +mysql

    MySQL 是一个流行的开源数据库系统,支持事务处理、ACID 属性和多种存储引擎。在 Web 应用中,MySQL 提供了高效的数据存储和检索能力。与 Spring MVC 和 MyBatis 结合使用时,MySQL 可以作为后端数据存储,MyBatis ...

    springboot多数据源切换mysql+sql server事例

    本示例“springboot多数据源切换mysql+sql server”是关于如何在Spring Boot项目中配置和使用多个数据库的数据源切换。下面将详细阐述这个主题的知识点。 首先,**多数据源**是指在一个应用中同时连接并操作多个...

    spring3 struts2 Mybatis3 组件注解 事务注解 实例

    首先,你需要在MySQL数据库中创建名为TEST的表,包含id和name两个字段,确保表引擎为InnoDB,因为InnoDB支持行级事务和外键约束,适合进行事务处理。 在项目配置中,你需要设置Spring的上下文配置,包括bean的定义...

    Spring的事务10种常见失效场景总结.zip

    以下是对Spring事务10种常见失效场景的详细分析: 1. **未开启事务**:如果在需要事务控制的方法中忘记添加`@Transactional`注解,Spring将不会自动进行事务管理,导致事务失效。记得在服务层方法上正确使用该注解...

    Spring+Mybatis+SpringMVC+Maven+MySql项目搭建实例.zip

    2. **配置Spring**:创建Spring的配置文件,如`applicationContext.xml`,配置Bean,包括数据源、事务管理器、Mybatis的SqlSessionFactory等。 3. **配置Mybatis**:创建Mybatis的配置文件`mybatis-config.xml`,...

    spring mvc、mybitis、mysql集成例子

    MySQL支持多种存储引擎,如InnoDB(用于事务处理,支持行级锁定)和MyISAM(适合读取密集型应用,不支持事务)。在Spring MVC和MyBatis的集成应用中,MySQL通常作为数据存储的后端。 集成过程的关键知识点: 1. ...

    Struts2+Spring+Hibernate+Jsp+Mysql5开发的项目申报系统

    Mysql5还支持多种存储引擎,如InnoDB用于事务处理,MyISAM适合读取密集型应用。其高效的查询性能和丰富的索引策略,使得数据查询更为快速。 在这个项目申报系统中,JSP(JavaServer Pages)用于生成动态网页,它是...

    尚硅谷mysql高级+尚硅谷springcloud思维导图.mmap

    1. SQL优化:包括查询优化、索引优化、存储引擎的选择以及SQL语句的重构,以提高数据查询速度和整体性能。 2. 触发器与存储过程:深入理解触发器的使用场景,如何编写和管理存储过程,提升数据库操作的自动化水平。...

    spring + spring mvc + hibernate + mysql 整合开发任务流程后台管理系统

    对于标签中的"java,ssh,te","java"代表Java语言,"ssh"是Spring、Struts和Hibernate的缩写,虽然本项目没有使用Struts,但可以理解为对Spring和Hibernate的整合,"te"可能是技术或者模板引擎的简写,可能指的是...

    Struts2+Hibernate4+Spring4+MySql5

    它支持多种存储引擎,如InnoDB用于事务处理,MyISAM用于读取密集型应用。MySql5提供了SQL标准的大部分功能,包括索引、视图、触发器等,同时具有良好的性能和稳定性。 在整合这些技术时,通常会使用Spring4作为核心...

Global site tag (gtag.js) - Google Analytics