4.Spring事务官方下载地址Power节点spring数据视频观看地址https://www.bilibili.com/video...4.1Spring事务管理事务本来是数据库中的一个概念,在Dao层。但一般情况下,需要将事务提升到业务层,也就是Service层。这样做是为了能够利用事务的特性来管理特定的业务。在Spring中,事务管理通常可以通过以下两种方式实现:(1)使用Spring的事务注解来管理事务(2)使用AspectJ的AOP配置来管理事务4.2Spring事务管理APISpring的事务管理主要使用两个与事务相关的界面。(1)事务管理器接口(重点)事务管理器是PlatformTransactionManager接口对象。主要用于完成事务的提交和回滚,获取事务的状态信息。A.两个常用的实现类PlatformTransactionManager接口有两个常用的实现类:DataSourceTransactionManager:使用JDBC或MyBatis进行数据库操作时使用。HibernateTransactionManager:使用Hibernate持久化数据时使用。B.Spring的回滚方式(理解)Spring事务默认的回滚方式是:运行时异常和错误发生时回滚,检查(编译)异常时提交。不过对于checkedexceptions,程序员也可以手动设置回滚方式。C.查看错误和异常(理解)Throwable类是Java语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,它才能被Java虚拟机或Java的throw语句抛出。Error是程序运行过程中无法处理的错误,如OutOfMemoryError、ThreadDeath、NoSuchMethodError等,当这些错误发生时,程序无法处理(catch或throw),JVM一般会终止线程。程序编译运行时出现的另一类错误称为异常,是JVM通知程序员的一种方式。通过这种方式告知程序员已经或可能已经发生错误,需要程序员进行处理。异常分为运行时异常和检查异常。运行时异常是RuntimeException类或其子类,即只发生在运行时的异常。例如NullPointerException、ArrayIndexOutOfBoundsException、IllegalArgumentException等都是运行时异常。这些异常由JVM抛出,不需要在编译时处理(捕获或抛出)。不过,只要认真编写代码,程序足够健壮,运行时异常是可以避免的。已检查异常,也称为编译时异常,是编写代码时必须捕获或抛出的异常。如果不处理,编译将不会通过。如SQLException、ClassNotFoundException、IOException等都是checkedexceptions。除了RuntimeException及其子类之外的异常都是检查异常。当然,Exception的自定义子类,即自定义异常也是checked异常。当程序员定义异常时,只要定义没有显式声明为RuntimeException的子类,就会检查定义的异常。(2)事务定义接口事务定义接口TransactionDefinition定义了三类与事务描述相关的常量:事务隔离级别、事务传播行为、事务默认超时时间,以及它们的操作。A.定义了五个事务隔离级别常量(master)。这些常量都以ISOLATION_开头。即形状为ISOLATION_XXX。DEFAULT:使用数据库默认的事务隔离级别。MySql默认为REPEATABLE_READ;Oracle默认为READ_COMMITTED。READ_UNCOMMITTED:读取未提交。没有解决并发问题。READ_COMMITTED:读取已提交。解决脏读、不可重复读和幻读。REPEATABLE_READ:可重复读取。解决脏读、不可重复读、幻读SERIALIZABLE:序列化。没有并发问题。B.定义七个事务传播行为常量(掌握)所谓事务传播行为是指不同事务中的方法相互调用时事务在执行过程中的维护。例如A事务中的方法doSome()调用B事务中的方法doOther(),调用执行过程中事务的维护称为事务传播行为。事务传播行为被添加到方法中。事务传播行为常量均以PROPAGATION_开头,形式为PROPAGATION_XXX。PROPAGATION_REQUIREDPROPAGATION_REQUIRES_NEWPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_NESTEDPROPAGATION_NEVERPROPAGATION_NOT_SUPPORTEDa,PROPAGATION_REQUIRED:指定的方法必须在事务内执行。如果有当前交易,则添加到当前交易;如果没有当前事务,将创建一个新事务。这种传播行为是最常见的选择,也是Spring默认的事务传播行为。例如,将传播行为添加到doOther()方法中。如果在调用doOther()方法时doSome()方法正在事务中运行,那么doOther()方法的执行也被加入到事务中。如果在调用doOther()方法时doSome()方法没有在事务中执行,doOther()方法会创建一个事务并在其中执行。b.PROPAGATION_SUPPORTS指定的方法支持当前事务,但是如果没有当前事务,也可以以非事务的方式执行。C。PROPAGATION_REQUIRES_NEW总是创建一个新事务。如果有当前事务,则当前事务会被挂起,直到新事务执行完毕。C.定义默认事务超时常量TIMEOUT_DEFAULT定义了事务底层的默认超时时间,以及sql语句的执行时间。注意事务的超时时间有很多条件起作用,超时时间的计算点比较复杂。因此,该值一般使用默认值。4.3程序环境搭建示例:采购商品trans_sale项目本示例是实现商品的采购,模拟用户下订单,在订单表中添加销售记录,从产品表中减少库存。实现步骤:Step0:创建数据库表创建两个数据库表sale,goodssale销售表goods表goods表dataStep1:maven依赖pom.xml
