Java面试----事务

1.什么是事务?

事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合;

2.事务的四大特性是什么?------ACID

原子性:一个事务所包含的所有操作是一个不可分割的整体,它们要么完全执行成功提交,要么完全执行失败回滚

一致性:事务的执行结果必须使数据库从一个一致的状态转换到另一个一致的状态

隔离性:每个事务的执行都是独立的,各并发执行的事务不能相互干扰

持续性:事务一旦提交,它对数据库的改变是永久性的

3.jdbc如何操作事务

JDBC通过Connection操作事务
try{
conn.getTranscationIsolation()   //方法设置隔离级别
conn.getAutoCommit(false)   // 方法关闭自动提交

执行多条SQL

conn.commit()  //都成功了,提交事务
}catch(){

执行失败了,捕获异常

conn.rollback()    //回滚
} finally{
conn.commit()  //最终再提交一下
}

4.Spring如何操作事务?

Spring并不是直接管理事务的,只是提供了多种事务管理器,让持久化机制所提供的平台框架的事务来实现事务管理。

Spring管理事务主要通过三个接口:

PlatformTransactionManager :是Spring事务管理的核心接口。主要功能是事务管理器,是用于平台相关事务的管理,包括commit 事务的提交;rollback 事务的回滚;getTransaction 事务状态的获取三种方法。

TransactionDefinition:主要功能是事务定义信息

TransactionStatus:主要功能是事务具体运行状态,是事务管理过程中,每个时间点事务的状态信息,它可以封装许多代码,节省我们的工作量。

Spring事务管理分为    编程式事务  和  声明式事务

编程式事务:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式管理事务当中,必须在每个事务操作中包含额外的事务管理代码,繁琐,不便.

声明式事务:是建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过

编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需通过基于@Transactional注解的方式或者配置文件中做相关的事务规则声明,便可以将事务规则应用到业务逻辑中。

并发事务带来的问题:

1.脏读

4.丢失修改

2.幻读

3.不可重复读

并发事务的隔离级别:

ransactionDefinition 接口中定义了五个表示隔离级别的常量:

ISOLATION_DEFAULT:使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.

ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别

可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

spring的事务传播行为一共分为以下几种(按词义记):

REQUIRED(常用)

REQUIRES_NEW(常用)

SUPPORTS

NOT_SUPPORTED

NEVER

NESTED

MANDATORY

事务的其他属性:

事务超时属性:通过TransactionDefinition设置。事务执行的最长时间,超时执行回滚

事务只读属性:通过TransactionDefinition设置。对事务性资源进行只读操作或者是读写操作。所谓事务性资源就是指那些被事务管理的资源,比如数据源、

JMS 资源,以及自定义的事务性资源等等。如果确定只对事务性资源进行只读操作,那么我们可以将事务标志为只读的,以提高事务处理的性能。

回滚规则:默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。