《spring事务》

参考博客:https://blog.csdn.net/luanlouis/article/details/95319795

一 spring事务是什么?有什么用?

spring事务的作用是:处理业务中多个操作需要同时提交的编程模型。

spring的事务隔离和事务传播机制则是事务需要解决的问题。

事务:单个逻辑单元内的一系列操作,要么完全执行,要么完全不执行。

spring事务在代码层面用的是spring aop,底层用的是数据库的事务。

对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:

  1. 获取连接 Connection con = DriverManager.getConnection()
  2. 开启事务con.setAutoCommit(true/false);
  3. 执行CRUD
  4. 提交事务/回滚事务 con.commit() / con.rollback();
  5. 关闭连接 conn.close();

二 事务特性

1 原子性:事务的原子性

2 一致性:中间状态的不可见性

3 隔离性:一个事务不受其它事务影响

4 持久性:持久到数据库

三 spring事务隔离级别

1 spring事务隔离解决的是数据的隔离性。

2 数据库的隔离级别一般分为四个级别,从隔离级别由高到低排序的话,分别是:SERIALIZABLE —> REPEATABLE READ—> READ_COMMITTED —>READ_UNCOMMITED,其分别表示如下几种含义:

(1)SERIALIZABLE 序列化读,隔离级别最高,客户端以互斥的方式访问数据库资源,统一时间内,同一个资源只能被一个客户端访问,好像客户端在排队请求访问,所以称为序列化读。锁全表,事务串行执行。
(2)REPEATABLE_READ 可重复读,可重复读能够保证,一个客户端在一个事务内,多次访问同一个资源时,返回结果是一样的,顾名思义,称为可重复读,这种隔离级别可能会造成幻读现象。锁行,事务并行执行,A事务两次查询中B事务新增/删除了数据,导致A事务两次查询的结果不一致,称为幻读。(侧重于数据增删)
(3)READ_COMMITTED 读已提交,即客户端在一个事务内,每次查询读取的数据都是从数据库读取最新的已提交的数据;这种隔离界别可能会造成不可重复读和幻读现象。锁行,事务并行执行,A事务两次查询中B事务修改了数据,导致A事务两次查询的结果不一致,称为不可重复读。(侧重于数据修改)
(4)READ_UNCOMMITTED 读未提交,即客户端在一个事务内,可以读取到其他客户端事务的尚未提交的数据;这种隔离级别可能会造成脏读、不可重复读、幻读 现象。锁行,事务并发执行,A事务读B事务还未commit的数据,B事务后来进行了回滚,导致A事务读到的数据是错误的数据。

四 spring事务传播机制

1 spring事务传播机制解决的是事务的嵌套调用

2 可分为

(1)支持当前事务:

当前有事务,加入当前事务;如果当前没有失误,则创建新事务/以非事务执行/抛出异常

(2)不支持当前事务:

当前有事务,新建事务,挂起外部事务;以非事务运行,挂起外部事务;抛出异常。

(3)spring独有的嵌套事务:外部事务的提交才能引起内部事务的提交

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章