一,事物概念
1.什么是事物
事物是关系型数据库的重要组成部分,一般指要做或所做的事情
2.事物特点
- 原子性 (atomicity):强调事务的不可分割.操作这些指令时,要么全部执行成功,要么全部不执行,只要其中一个指令执行失败,所有的执行都执行失败,数据进行回滚,回到执行指令前的数据状态。
- 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
- 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰。比如操作同一张表是,数据库为每个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。要达到这么一种效果,对于任意两个并发的事务t1和t2,在事务t1看来,t2要么在t1开始之前就已经结束了,要么在t1结束之后再开始,这样每个事务都干净,没有其他事务在并发的执行。
- 持久性(durability) :事务一旦结束,数据就持久到数据库,他对于数据的改变是永久性。
二,spring事物
1.spring支持以下两种方式管理事物
编程式事物管理:
编程式事物管理是通过编写代码实现的事物管理,这种方式能够在代码中精确的定义事物的边界,我们可以根据事物从哪里开始到哪里结束
声明式事物管理:
Spring声明式事物管理在底层使用采用了AOP技术,只需要在配置文件中进行相关的规则声明,就可以将事物规则应用到业务逻辑中。主要通过2种方式实现:基于XML方式的声明式事物管理和基于注解的事物管理
2.spring事物的传播特性
传播特性:指当一个事物方法被另一个事物方法调用时,这个事物方法该如何进行
Spring7种事物传播特性:
1.propagation_required: 默认事务类型,如果没有,就新建一个事务;如果有,就加入当前事务。适合绝大多数情况。
2.propagation_required_new: 如果没有,就新建一个事务;如果有,就将当前事务挂起。
3.propagation_nested: 如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。
4.propagation_supports: 如果没有,就以非事务方式执行;如果有,就使用当前事务。
5.propagation_not_supported: 如果没有,就以非事务方式执行;如果有,就将当前事务挂起。即无论如何不支持事务。
6.propagation_never: 如果没有,就以非事务方式执行;如果有,就抛出异常。
7.propagation_mandatory: 如果没有,就抛出异常;如果有,就使用当前事务。
3.Spring隔离级别
- @Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读),MYSQL默认级别
- @Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读),SQLSERVER默认级别
- @Transactional(isolation = Isolation.SERIALIZABLE)
串行化,这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防 止 脏读、不可重复读外,还避免了幻像读。
- @Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用
其中:
脏读 : 一个事务读取到另一事务未提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说,
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据