事务
JDBC事务
在JDBC中处理事务,都是通过Connection完成的。
同一事务中所有的操作,都在使用同一个Connection对象。
①JDBC中的事务
Connection的三个方法与事务有关:
setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,那么相当于开启了事务了;con.setAutoCommit(false) 表示开启事务。
commit():提交结束事务。
rollback():回滚结束事务。
JDBC处理事务的代码格式:
try{ con.setAutoCommit(false);//开启事务 ...... con.commit();//try的最后提交事务 } catch() { con.rollback();//回滚事务 }
来自: https://www.cnblogs.com/gdwkong/p/7633016.html
Spring事务管理可以分为两种:编程式以及声明式。
①声明式事务的实现,在Java工程中一般有有两种方式:
(1)使用配置文件(XML)进行事务规则相关规则的声明
在传统的Web工程中,我们通常使用XML配置,利用Spring的AOP切面编程手段,将事务以切面的方式注入到Service的各个数据库操作方法中去:
<!-- dataSource数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 连接池中保留的最大连接数。默认为15 --> <property name="maxPoolSize" value="${c3p0.pool.maxPoolSize}"/> <!-- 连接池中保留的最小连接数。默认为15 --> <property name="minPoolSize" value="${c3p0.pool.minPoolSize}" /> <!-- 初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3 --> <property name="initialPoolSize" value="${c3p0.pool.initialPoolSize}"/> <!-- 定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30 --> <property name="acquireIncrement" value="${c3p0.pool.acquireIncrement}"/> </bean> <!-- 事务管理 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 事务通知(隔离级别、传播行为) --> <tx:advice id="txAdivce" transaction-manager="txManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="find*" read-only="false"/> <tx:method name="get*" read-only="false"/> <tx:method name="view*" read-only="false"/> </tx:attributes> </tx:advice> <!-- 切入事务 --> <aop:config> <aop:pointcut expression="execution(* com.*.service.*.*(..))" id="txPointcut"/> <aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/> </aop:config>
针对事务,我们首先配置了【数据源】,然后配置了【事务管理器】,然后配置了【事务通知】,定义了各种方法的事务操作规范。最后将【事务管理器】切入需要进行事务管理的Service方法中。
(2)使用@Transactional注解进行控制
。而在Spring Boot中的推荐操作是,使用@Transactional注解来申明事务。
要在Spring boot中支持事务,首先要导入Spring boot提供的JDBC或JPA依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <scope>test</scope> </dependency>
在Spring Boot中使用@Transactional注解,只需要在启动类上添加@EnableTransactionManagement注解开启事务支持:
package cn.com.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement //开启声明式事务 @SpringBootApplication //Sprnig Boot项目的核心注解,主要目的是开启自动配置 public class MainApplication { //该main方法作为项目启动的入口 public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
使用@Transactional注解进行事务控制时,可以在其中添加有关“隔离级别”和“传播行为”的指定:
(1)隔离级别
DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_COMMITTED 。
READ_UNCOMMITTED :该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
READ_COMMITTED :该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
REPEATABLE_READ :该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。
SERIALIZABLE :所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
指定方法:通过使用 isolation 属性设置,例如:
@Transactional(isolation = Isolation.DEFAULT)
(2)传播行为
REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。
NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。
指定方法:通过使用 propagation 属性设置,例如:
@Transactional(propagation = Propagation.REQUIRED)
@Transactional(propagation=Propagation.REQUIRED,timeout = 10,isolation=Isolation.DEFAULT,rollbackFor=Exception.class)
原文链接:https://blog.csdn.net/acmman/article/details/82926410
讲的仔细:https://www.cnblogs.com/kesimin/p/9546225.html