Spring管理事务知识

目录

1.什么是事务

2.事务的特性ACID

3.Spring 管理事务的方式

4.Spring管理事务的体现:JDBCTemplate

5.声明式事务的属性有哪些

6.声明式事务属性---只读

7.声明式事务属性---超时

8.声明式事务属性---回滚策略

9.声明式事务属性---事务隔离级别

10.声明式事务属性---事务传播行为


1.什么是事务

 概念:事务就是一种SQL语句执行的缓存机制,不会单条执行完毕就更新数据库数据,最终根据缓存内的多条语句执行结果统一判定:

        所有执行结果判定成功:触发commit提交事务来结束事务,更新数据

        任意一个执行结果失败:触发rollback回滚结束事务

优势:允许在失败情况下,数据回到业务之前的状态

2.事务的特性ACID

Atomicity-原子性:事务是一个不可分割的工作单位,事务中的操作要么都执行,要么都不执行

Consistency-一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态

Isolation-隔离性:事务的隔离性指事务并发执行时,不会被其他事务干扰

Durability-持久性:一个事务一旦被提交,它对数据库数据的改变就是永久性的

3.Spring 管理事务的方式

编程式事务:将业务逻辑一层一层全部代码实现,通常是使用TransactionTemplate手动管理事务,应用很少

声明式事务:使用xml配置文件或者基于注解管理事务,即使用AOP管理事务;提高了开发效率,能够优化性能

4.Spring管理事务的体现:JDBCTemplate

1.JDBCTemplate的位置:是Spring封装JDBC后形成的框架---SpringJDBC的一个类

2.为什么需要JDBCTemplateJDBCTemplate中有各种对数据库增删改查的方法,方便操作数据库

5.声明式事务的属性有哪些

1.属性有:只读、超时、回滚策略、事务隔离级别、事务传播行为

2.设置方式:使用@Transaction注解,设置相对应的属性

Spring管理事务知识_第1张图片

 

6.声明式事务属性---只读

1.设置只读:

@Transactional(
    readOnly = true
)

2.作用:对于一个设置为只读的查询操作,数据库就知道该操作不涉及写操作,从而针对性优化

7.声明式事务属性---超时

1.设置超时:

@Transactional(
    timeout = 3
)

2.作用:在XXXs时间内未执行完毕就强制回滚;

8.声明式事务属性---回滚策略

1.设置回滚

@Transactional(
    rollbackFor = Exception.class
    rollbackForClassName = java.lang.Exception
    noRollbackFor = Exception.class
    noRollbackForClassName = java.lang.Exception
)

2. 回滚策略的四个属性:

        因为…而回滚:

                rollbackFor属性:需要设置一个Class类型的对象
                rollbackForClassName属性:需要设置一个字符串类型的全类名

        不因为…而回滚:
                noRollbackFor属性:需要设置一个Class类型的对象
                noRollbackForClassName属性:需要设置一个字符串类型的全类名

3.作用:以下列代码为例:

@Transactional(
    noRollbackForClassName = java.lang.Exception
)

该代码的意思是:在事务执行的过程中,即使发生了Exception也不会发生回滚,事务正常执行

 

9.声明式事务属性---事务隔离级别

1.设置隔离级别为默认级别(在mysql中为可重复读)

@Transactional(
    isolation = Isolation.DEFAULT
)

2.什么是隔离级别:事务与其他事务的隔离程度;隔离级别越高,数据一致性越好,并发性越弱

3.隔离级别有几种:

        从低到高为:读未提交、读已提交、可重复读(默认)、串行化

4.不同的隔离级别产生的脏读、不可重复读、幻读情况

Spring管理事务知识_第2张图片

10.声明式事务属性---事务传播行为

1.设置事务传播行为:表示不管当前线程上是否有已经开启的事务,都要开启新事务

@Transactional(
    propagation = Propagation.REQUIRES_NEW
)

2. propagation(枚举类)属性的值有:

        propagation=Propagation.REQUIRED:默认情况,表示如果当前线程上有已经开启的事务可用,那么就在这个事务中运行。

        propagation=Propagation.REQUIRES_NEW:表示不管当前线程上是否有已经开启的事务,都要开启新事务

你可能感兴趣的:(Java日常学习,数据库,sql,java)