寺庙网站开发建设方案,安徽智能网站建设制作,重庆建站服务商,网站 费用1.什么是事务 
事务是逻辑上的一组操作#xff0c;要么都执行#xff0c;要么都不执行。 
需要注意的是#xff1a;事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是#xff0c;如果把数据库引擎变为 myisam#x…1.什么是事务 
事务是逻辑上的一组操作要么都执行要么都不执行。 
需要注意的是事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的 innodb引擎。但是如果把数据库引擎变为 myisam那么程序也就不再支持事务了 
2.spring支持两种方式的事务管理 2.1编程式事务管理 
通过 TransactionTemplate或者TransactionManager手动管理事务实际应用中很少使用但是对于你理解 Spring 事务管理原理有帮助。 使用TransactionTemplate 进行编程式事务管理的示例代码如下 
Autowired
private TransactionTemplate transactionTemplate;
public void testTransaction() {transactionTemplate.execute(new TransactionCallbackWithoutResult() {Overrideprotected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {try {// ....  业务代码} catch (Exception e){//回滚transactionStatus.setRollbackOnly();}}});
} 
使用 TransactionManager 进行编程式事务管理的示例代码如下 
Autowired
private PlatformTransactionManager transactionManager;public void testTransaction() {TransactionStatus status  transactionManager.getTransaction(new DefaultTransactionDefinition());try {// ....  业务代码transactionManager.commit(status);} catch (Exception e) {transactionManager.rollback(status);}
}2.2声明事务管理 
推荐使用代码侵入性最小实际是通过 AOP 实现基于Transactional 的全注解方式使用最多。 
使用 Transactional注解进行事务管理的示例代码如下 
Transactional(propagationpropagation.PROPAGATION_REQUIRED)
public void aMethod {//do somethingB b  new B();C c  new C();b.bMethod();c.cMethod();
}3.Transactional 注解使用详解 
作用范围 方法推荐将注解使用于方法上不过需要注意的是该注解只能应用到 public 方法上否则不生效  类如果这个注解使用在类上的话表明该注解对该类中所有的 public 方法都生效。  接口 不推荐在接口上使用。 Transactional注解源码如下里面包含了基本事务属性的配置 
Target({ElementType.TYPE, ElementType.METHOD})
Retention(RetentionPolicy.RUNTIME)
Inherited
Documented
public interface Transactional {AliasFor(transactionManager)String value() default ;AliasFor(value)String transactionManager() default ;Propagation propagation() default Propagation.REQUIRED;Isolation isolation() default Isolation.DEFAULT;int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;boolean readOnly() default false;Class? extends Throwable[] rollbackFor() default {};String[] rollbackForClassName() default {};Class? extends Throwable[] noRollbackFor() default {};String[] noRollbackForClassName() default {};} 
Transactional 的常用配置参数总结 isolation:用于指定事务的隔离级别。默认底层事务的隔离级别。noRollbackFor:指定遇到特定异常时强制不回滚事务。noRollbackForClassName:指定遇到特定的多个异常时强制不回滚事务。该属性值可以指定多个异常类名。propagation指定事务传播行为readOnly指定事务是否只读。rollbackFor指定遇到特定异常时强制回滚事务。rollbackForClassName:指定遇到特定的多个异常强制回滚事务。该属性值可以指定多个异常类名。timeout指定事务的超时时长。单位为秒当超时时会引发异常默认会导致事务回滚。使用声明式事务需要配置注解驱动在配置文件中加上如下配置就可以使用Transactional配置事务了。 
!--    根据注解生成事务代理--tx:annotation-driven transaction-managertransactionManager/ 
Transactional 的使用注意事项总结 Transactional 注解只有作用到 public 方法上事务才生效不推荐在接口上使用避免同一个类中调用 Transactional 注解的方法这样会导致事务失效正确的设置 Transactional 的 rollbackFor 和 propagation 属性否则事务可能会回滚失败;被 Transactional 注解的方法所在的类必须被 Spring 管理否则不生效底层使用的数据库必须支持事务机制否则不生效。4.Spring事务管理接口介绍 
Spring 框架中事务管理相关最重要的 3 个接口如下 PlatformTransactionManager 平台事务管理器Spring 事务策略的核心。TransactionDefinition 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)。TransactionStatus事务运行状态我们可以把 PlatformTransactionManager 接口可以被看作是事务上层的管理者而 TransactionDefinition 和 TransactionStatus 这两个接口可以看作是事务的描述。 
PlatformTransactionManager 会根据 TransactionDefinition 的定义比如事务超时时间、隔离级别、传播行为等来进行事务管理 而 TransactionStatus 接口则提供了一些方法来获取事务相应的状态比如是否新事务、是否可以回滚等等。 
PlatformTransactionManager:事务管理接口 Spring 并不直接管理事务而是提供了多种事务管理器 。Spring 事务管理器的接口是PlatformTransactionManager。 通过这个接口Spring 为各个平台如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了对应的事务管理器但是具体的实现就是各个平台自己的事情了。   
PlatformTransactionManager接口中定义了三个方法 
package org.springframework.transaction;import org.springframework.lang.Nullable;public interface PlatformTransactionManager {//获得事务TransactionStatus getTransaction(Nullable TransactionDefinition var1) throws TransactionException;//提交事务void commit(TransactionStatus var1) throws TransactionException;//回滚事务void rollback(TransactionStatus var1) throws TransactionException;
}TransactionDefinition:事务属性 
事务管理器接口 PlatformTransactionManager 通过 getTransaction(TransactionDefinition definition) 方法来得到一个事务这个方法里面的参数是 TransactionDefinition 类 这个类就定义了一些基本的事务属性。 
4.1什么是事务属性 
事务属性包含了5个方面 
隔离级别传播行为回滚规则是否只读事务超时
TransactionDefinition 接口中定义了 5 个方法以及一些表示事务属性的常量比如隔离级别、传播行为等等。 
package org.springframework.transaction;import org.springframework.lang.Nullable;public interface TransactionDefinition {int PROPAGATION_REQUIRED  0;int PROPAGATION_SUPPORTS  1;int PROPAGATION_MANDATORY  2;int PROPAGATION_REQUIRES_NEW  3;int PROPAGATION_NOT_SUPPORTED  4;int PROPAGATION_NEVER  5;int PROPAGATION_NESTED  6;int ISOLATION_DEFAULT  -1;int ISOLATION_READ_UNCOMMITTED  1;int ISOLATION_READ_COMMITTED  2;int ISOLATION_REPEATABLE_READ  4;int ISOLATION_SERIALIZABLE  8;int TIMEOUT_DEFAULT  -1;// 返回事务的传播行为默认值为 REQUIRED。int getPropagationBehavior();//返回事务的隔离级别默认值是 DEFAULTint getIsolationLevel();// 返回事务的超时时间默认值为-1。如果超过该时间限制但事务还没有完成则自动回滚事务。int getTimeout();// 返回是否为只读事务默认值为 falseboolean isReadOnly();NullableString getName();
}5.事务的特性ACID 原子性一个事务transaction中的所有操作或者全部完成或者全部不完成不会结束在中间某个环节。事务在执行过程中发生错误会被回滚Rollback到事务开始前的状态就像这个事务从来没有执行过一样。即事务不可分割、不可约简。  一致性在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。  隔离性数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别包括未提交读Read uncommitted、提交读read committed、可重复读repeatable read和串行化Serializable。  持久性事务处理结束后对数据的修改就是永久的即便系统故障也不会丢失。 6.事务隔离级别和传播行为 6.1事务隔离级别 
下面我依次对每一种事务隔离级别进行介绍 TransactionDefinition.ISOLATION_DEFAULT : 使用后端数据库默认的隔离级别MySQL 默认采用的 REPEATABLE_READ可重复读 隔离级别 Oracle 默认采用的 READ_COMMITTED 隔离级别。TransactionDefinition.ISOLATION_READ_UNCOMMITTED :最低的隔离级别使用这个隔离级别很少因为它允许读取尚未提交的数据变更可能会导致脏读、幻读或不可重复读。TransactionDefinition.ISOLATION_READ_COMMITTED : 允许读取并发事务已经提交的数据可以阻止脏读但是幻读或不可重复读仍有可能发生。TransactionDefinition.ISOLATION_REPEATABLE_READ : 对同一字段的多次读取结果都是一致的除非数据是被本身事务自己所修改可以阻止脏读和不可重复读但幻读仍有可能发生。TransactionDefinition.ISOLATION_SERIALIZABLE : 最高的隔离级别完全服从 ACID 的隔离级别。所有的事务依次逐个执行这样事务之间就完全不可能产生干扰也就是说该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。事务超时属性 
所谓事务超时就是指一个事务所允许执行的最长时间如果超过该时间限制但事务还没有完成则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间其单位是秒默认值为-1。 
6.2事务传播行为 
事务传播行为是为了解决业务层方法之间互相调用的事务问题。 
正确的事务传播行为可能的值如下 TransactionDefinition.PROPAGATION_REQUIRED 使用的最多的一个事务传播行为我们平时经常使用的Transactional注解默认使用就是这个事务传播行为。如果当前存在事务则加入该事务如果当前没有事务则创建一个新的事务。也就是说 如果外部方法没有开启事务的话Propagation.REQUIRED修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。如果外部方法开启事务并且被Propagation.REQUIRED的话所有Propagation.REQUIRED修饰的内部方法和外部方法均属于同一事务 只要一个方法回滚整个事务均回滚。传播行为是指方法之间的调用事务策略的问题Spring支持的事务传播行为如下 
Spring支持的事务传播行为包括REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。其中 REQUIRED表示如果当前存在事务则加入该事务否则创建一个新的事务SUPPORTS表示如果当前存在事务则加入该事务否则以非事务状态执行MANDATORY表示必须存在一个事务否则抛出异常REQUIRES_NEW表示创建一个新的事务并挂起当前的事务NOT_SUPPORTED表示以非事务状态执行并挂起当前的事务NEVER表示必须不存在事务否则抛出异常NESTED表示如果当前存在事务则在嵌套事务内执行否则创建一个新的事务。