首页 > 编程知识 正文

java面试中经常被问到的问题,java项目开发实例

时间:2023-05-05 20:07:03 阅读:34818 作者:714

一、事务的概念

事务一般是指做或做。 计算机术语是指可能访问和更新数据库中各种数据项的程序执行单元(unit )。 事务通常是由执行用高级数据库操作语言(如SQL、c和Java )或编程语言编写的用户程序引起的,而不是begin transaction、end transaction语句或函数调用它由在“事务开始”(begin transaction )和“事务结束”(end transaction )期间执行的整个操作组成。 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /

简单举例说明,在银行转账业务中,账户a必须将自己账户的1000元转移到b账户下,a账户的余额必须先扣除1000元,然后b账户增加1000元。 中间网络出现问题,a账户扣除1000元退出,b因网络中断操作失败,整个业务失败,必须控制,要求撤销a账户转账业务。 这才能保证业务的正确性。 完成这个操作需要事务。 将a账户资金减少和b账户资金增加列入同一事务,要么全部执行成功,要么全部取消,保证数据的安全性。简单地说,事务是逻辑上的一组操作,要么都执行,要么都不执行。

原子事务是数据库的逻辑工作单位,是必须是原子的工作单位,可以全部执行或不全部执行其数据修改。 一致性:事务完成时,所有数据都必须保持一致。 在相关数据库中,所有规则都必须应用于事务更改以维护所有数据的完整性。 (例)转账,两个账户余额相加,值不变。 (隔离性) isolation ) :一个事务的执行不能被其他事务所影响。 提交“持久性”(durability )事务后,事务操作将永久保存在数据库中。 即使数据库系统发生故障,提交事务的操作也不会丢失。二、事务的理解

1、JDBC事务

2、JTA事务

3、集装箱事务http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /

JDBC处理所有事务都是通过连接完成的。 同一事务中的所有操作都使用同一连接对象。 缺省情况下,JDBC事务处于打开状态,这是缺省提交。

JDBC连接接口有两种事务模式。 自动提交和手动提交JDBC的事务java.sql.Connection有三种方法与事务相关。 如果将setautocommit(boolean ) :设置为自动提交事务,则true默认值为true。commit () :提交结束事务。 回滚(:回滚结束事务。事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。

1 )获取JDBC连接

2 )声明SQL

3 )预编译SQL

4 )运行SQL

5 )处理结果集

6 )发布结果集

7 )释放语句

8 ) .提交事务

9 )处理异常并回滚事务

10 ) JDBC连接三、事务的四大特性

JDBC显示冗馀且重复的事务控制每个步骤的不可获取性检查异常,最基本的支持使用Java对数据库进行事务处理操作。 使用JDBC事务,可以将多个SQL语句放在同一事务中,以确保ACID特性。 JDBC事务的主要优点是API相对简单,可以提供最基本的事务处理操作,性能也相对较好。 但是,JDBC事务是有限制的。 一个JDBC事务不能跨越多个数据库。 因此,如果涉及多个数据库操作或分布式方案,JDBC事务将变得无能为力。四、java的事务类型

与Spring事务管理相关的接口及其联系方式:

Spring不直接管理事务,而是提供各种事务管理器,将事务管理角色委托给Hibernate和JTA等持久化机制提供的相关平台框架的事务。

Spring事务管理器的接口是org.Spring framework.transaction.platformtransactionmanager,通过该接口,spring可以访问JDBC、

从publicinterfaceplatformtransactionmanager//transaction definition到TransactionStatus对象transaction statusgettransaction (翻译状态

TransactionException; // 提交 Void commit(TransactionStatus status) throws TransactionException; // 回滚 Void rollback(TransactionStatus status) throws TransactionException; }

(1)SpringJDBC事务
如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用 DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean>

实际上,DataSourceTransactionManager是通过调用java.sql.Connection来管理事务。通过调用连接的commit()方法来提交事务,同样,事务失败则通过调用rollback()方法进行回滚。
(2)Hibernate事务
如果应用程序的持久化是通过Hibernate实现的,那么你需要使用HibernateTransactionManager。对于Hibernate3,需要在Spring上下文定义中添加如下的声明:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /></bean> sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法,反之,将会调用rollback()方法。

(3)Java持久化API事务(JPA)
Hibernate多年来一直是事实上的Java持久化标准,但是现在Java持久化API作为真正的Java持久化标准进入大家的视野。如果你计划使用JPA的话,那你需要使用Spring的JpaTransactionManager来处理事务。你需要在Spring中这样配置JpaTransactionManager:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /></bean>

JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。
六、基本的事务属性的定义:

事务管理器接口PlatformTransactionManager通过getTransaction(TransactionDefinition definition)方法来得到事务,这个方法里面的参数是TransactionDefinition类,这个类就定义了一些基本的事务属性。事务属性可以理解成事务的一些基本配置,描述了事务策略如何应用到方法上。

七、事务属性包含了5个方面
传播行为、隔离规则、回滚规则、事务超时、是否只读。
TransactionDefinition:

public interface TransactionDefinition { int getPropagationBehavior(); // 返回事务的传播行为 int getIsolationLevel(); // 返回事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据 int getTimeout(); // 返回事务必须在多少秒内完成 boolean isReadOnly(); // 事务是否只读,事务管理器能够根据这个返回值进行优化,确保事务是只读的}

1、7种传播行为
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
虽然有7种,但是常用的就第一种REQUIRED和第四种REQUIRES_NEW
2、五个隔离级别
ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
另外四个与JDBC的隔离级别相对应;
ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
除了防止脏读,不可重复读外,还避免了幻像读。

八、事务的属性可同通过注解方式或配置文件配置
1、注解方式

@Transactional只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.默认情况下,一个有事务方法, 遇到RuntimeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) @Transactional( readOnly = false, //读写事务 timeout = -1 , //事务的超时时间,-1为无限制 noRollbackFor = ArithmeticException.class, //遇到指定的异常不回滚 isolation = Isolation.DEFAULT, //事务的隔离级别,此处使用后端数据库的默认隔离级别 propagation = Propagation.REQUIRED //事务的传播行为)

2、配置文件( aop拦截器方式)

@Transactional( readOnly = false, //读写事务 timeout = -1 , //事务的超时时间,-1为无限制 noRollbackFor = ArithmeticException.class, //遇到指定的异常不回滚 isolation = Isolation.DEFAULT, //事务的隔离级别,此处使用后端数据库的默认隔离级别 propagation = Propagation.REQUIRED //事务的传播行为)

原文参考地址:https://blog.csdn.net/weixin_37934748/article/details/82774230

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。