运行配置@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格式的一个重要缺陷就是不能在表损坏后恢复数据。
HEAP:HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。
InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者 或者两者,那你就要被迫使用后两个引擎中的一个了。
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
普通事务的实现以jdbm3为例,大概是这样的过程:
每个事务都新建一个事务文件,当commit时,先把修改过的数据块,写到事务文件里,然后再一次性地写到数据库文件里。
如果commit时挂掉了,那么重启之后,会再次从事务文件里把修改过的块写到数据库文件里。最后再删除事务文件。
相关推荐
MySQL 8.0引入了诸多新特性,如窗口函数、JSON增强、InnoDB存储引擎的改进等。在与Spring和Hibernate整合时,需要正确配置MySQL的JDBC驱动(通常为`mysql-connector-java`),以便Spring的JdbcTemplate或Hibernate...
2. **存储引擎**:InnoDB是MySQL的主要存储引擎,支持事务处理和行级锁定,适合并发操作。MyISAM则适用于读取密集型应用,因为它提供了更快的读取速度。 3. **SQL支持**:MySQL支持标准SQL查询语言,可以执行复杂的...
4. **事务管理**:由于MySQL集群支持分布式事务,Spring的声明式事务管理能够无缝地工作。只需在需要事务的Service层方法上添加@Transactional注解,Spring会自动管理事务的开始、提交或回滚。 5. **高可用性和负载...
MySQL作为广泛使用的SQL数据库,虽然默认不支持分布式事务,但可以通过InnoDB存储引擎启用行级锁和事务支持。在SpringBoot中配置MySQL事务管理,我们通常会使用DataSourceTransactionManager,它适用于单数据库事务...
5. **配置Spring**:编写Spring的配置文件(如applicationContext.xml),声明数据源、SessionFactory以及事务管理器等。 6. **配置Hibernate**:在hibernate.cfg.xml文件中设置数据库连接信息,以及实体类到数据库...
2. **MySQL**:MySQL是一个广泛使用的开源关系型数据库管理系统,支持事务处理和多种存储引擎。在读写分离的场景下,我们通常会设置一个主库(Master)进行写操作,多个从库(Slaves)进行读操作。MySQL支持主从复制...
本篇将深入探讨Spring事务管理的实现原理以及MySQL InnoDB引擎的行锁概念。 Spring事务管理是通过其核心接口`PlatformTransactionManager`来实现的,它定义了事务开始、提交、回滚和查询事务状态的方法。Spring提供...
MySQL 的 InnoDB 引擎默认使用此级别。 5. **Isolation.SERIALIZABLE**:最高的隔离级别,完全避免了脏读、不可重复读和幻读,但性能最差,因为需要锁定事务涉及的所有行。 在实际应用中,开发者需要根据业务需求...
MySQL支持SQL标准,具有事务处理、查询优化和多种存储引擎等功能。 Spring 框架是Java企业级应用开发的基石,它提供了全面的面向切面编程(AOP)支持,包括Java配置、XML配置和注解配置。Spring还包含了数据访问/...
"Spring事务失效的具体场景及解决方案详细整理" 在实际项目开发中,为了保证业务数据的一致性,大家一般都会采用事务机制。但是,很多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手。下面我们将...
本示例“springboot多数据源切换mysql+sql server”是关于如何在Spring Boot项目中配置和使用多个数据库的数据源切换。下面将详细阐述这个主题的知识点。 首先,**多数据源**是指在一个应用中同时连接并操作多个...
MySQL 是一个流行的开源数据库系统,支持事务处理、ACID 属性和多种存储引擎。在 Web 应用中,MySQL 提供了高效的数据存储和检索能力。与 Spring MVC 和 MyBatis 结合使用时,MySQL 可以作为后端数据存储,MyBatis ...
首先,你需要在MySQL数据库中创建名为TEST的表,包含id和name两个字段,确保表引擎为InnoDB,因为InnoDB支持行级事务和外键约束,适合进行事务处理。 在项目配置中,你需要设置Spring的上下文配置,包括bean的定义...
以下是对Spring事务10种常见失效场景的详细分析: 1. **未开启事务**:如果在需要事务控制的方法中忘记添加`@Transactional`注解,Spring将不会自动进行事务管理,导致事务失效。记得在服务层方法上正确使用该注解...
2. **配置Spring**:创建Spring的配置文件,如`applicationContext.xml`,配置Bean,包括数据源、事务管理器、Mybatis的SqlSessionFactory等。 3. **配置Mybatis**:创建Mybatis的配置文件`mybatis-config.xml`,...
MySQL支持多种存储引擎,如InnoDB(用于事务处理,支持行级锁定)和MyISAM(适合读取密集型应用,不支持事务)。在Spring MVC和MyBatis的集成应用中,MySQL通常作为数据存储的后端。 集成过程的关键知识点: 1. ...
Mysql5还支持多种存储引擎,如InnoDB用于事务处理,MyISAM适合读取密集型应用。其高效的查询性能和丰富的索引策略,使得数据查询更为快速。 在这个项目申报系统中,JSP(JavaServer Pages)用于生成动态网页,它是...
1. SQL优化:包括查询优化、索引优化、存储引擎的选择以及SQL语句的重构,以提高数据查询速度和整体性能。 2. 触发器与存储过程:深入理解触发器的使用场景,如何编写和管理存储过程,提升数据库操作的自动化水平。...
对于标签中的"java,ssh,te","java"代表Java语言,"ssh"是Spring、Struts和Hibernate的缩写,虽然本项目没有使用Struts,但可以理解为对Spring和Hibernate的整合,"te"可能是技术或者模板引擎的简写,可能指的是...
它支持多种存储引擎,如InnoDB用于事务处理,MyISAM用于读取密集型应用。MySql5提供了SQL标准的大部分功能,包括索引、视图、触发器等,同时具有良好的性能和稳定性。 在整合这些技术时,通常会使用Spring4作为核心...