Spring中事务的使用和配置

Spring–事务配置
1、事务概念
(1)事务是数据库操作的最基本单元,逻辑上一组操作,要么都成功,要么都失败。
(2)典型场景,我给你转100,我少100,你多100
四个特性
(1)原子性:事务是最小的执行单位,不允许分割。事务的原子性保证动作要么全部完成,要么全部不起作用。
(2)一致性:执行事务前后数据保持一直,多个事务对同一个数据读取的结果是相同的。
(3)隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间的数据库时独立的。
(4)持久性:一个事务被提交之后,它在数据库中数据的改变是持久的,即使数据库发生故障也不会改变。

2、事务操作(模拟事务操作环境)
(1)创建service,搭建dao,完成对象创建和注入关系

3、事务隔离级别
(1)事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性会产生很多问题。
(2)有三个读问题:脏读、不可重复读、虚读
脏读:一个未提交事务读取到另一个未提交事务的数据。对于两个事务T1,T2,T1读取了已经被T2更新但还没有提交的字段,之后T2进行了回滚操作,T1读取的内容是临时且无效的。

不可重复读:一个未提交事务读取到另一提交事务修改数据,就是T1第一次读取了一个字段,T2更新了该字段,之后T1再次读取了这个字段,值就不同了。

虚读:一个未提交事务读取到另一提交事务添加数据。T1从表中读取了一个字段,T2在表中加入了一些行,如果T1再读取该表,就会多出了几行。

4、什么是事务隔离级别?Mysql的默认隔离级别
Spring中事务的使用和配置
SQL定义了四个隔离级别:
(1)READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,都可能会导致。
(2)READ-COMMITTED(读取已提交):允许读取并发事务已提交的数据,可以阻止脏读。
(3)REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己修改的,可以阻止脏读和不可重复读。
(4)SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有事务一次逐个执行,事务之间完全不能干扰。
注意:Mysql默认采用REPEATABLE-READ隔离级别,Oracle默认采用READ-COMMITTED。
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到**SERIALIZABLE(可串行化)**隔离级别。

5、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交就回滚。
(2)默认值是-1(不超时),设置时间以秒为单位进行计算。
readOnly:是否只读
rollbackFor:回滚
noRollbackFor:不回滚

上一篇:合并多个结果集 SQL语言的高级用法


下一篇:存储过程往mysql数据库批量添加数据