当前位置: 首页 > news >正文

青岛企业网站建站模板学院网站建设项目的成本计划书

青岛企业网站建站模板,学院网站建设项目的成本计划书,计算机网络实验 做网站的,ui中国设计网站页面目录 1. 什么是事务#xff1f; 2. 事务的特性#xff08;ACID#xff09;了解么? 3. 详谈 Spring 对事务的支持 3.1. Spring 支持两种方式的事务管理 1).编程式事务管理 2)声明式事务管理 3.2. Spring 事务管理接口介绍 3.2.1. PlatformTransactionManager:事务管理… 目录 1. 什么是事务 2. 事务的特性ACID了解么? 3. 详谈 Spring 对事务的支持 3.1. Spring 支持两种方式的事务管理 1).编程式事务管理 2)声明式事务管理 3.2. Spring 事务管理接口介绍 3.2.1. PlatformTransactionManager:事务管理接口 3.2.2. TransactionDefinition:事务属性 3.2.3. TransactionStatus:事务状态 3.3. 事务属性详解 3.3.1. 事务传播行为 3.3.2 事务隔离级别 3.3.3. 事务超时属性 3.3.3. 事务只读属性 3.3.4. 事务回滚规则 3.4. Transactional 注解使用详解 1) Transactional 的作用范围 2) Transactional 的常用配置参数 3)Transactional 事务注解原理 4)Spring AOP 自调用问题 5) Transactional 的使用注意事项总结 1. 什么是事务 事务是逻辑上的一组操作要么都执行要么都不执行。 Guide 哥大家应该都能背上面这句话了下面我结合我们日常的真实开发来谈一谈。 我们系统的每个业务方法可能包括了多个原子性的数据库操作比如下面的 savePerson() 方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的它们要么都执行要不就都不执行。 public void savePerson() {personDao.save(person);personDetailDao.save(personDetail);} 另外需要格外注意的是事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是如果把数据库引擎变为 myisam那么程序也就不再支持事务了 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元这个转账会涉及到两个关键操作就是 将小明的余额减少 1000 元 将小红的余额增加 1000 元。 万一在这两个操作之间突然出现错误比如银行系统崩溃或者网络故障导致小明余额减少而小红的余额没有增加这样就不对了。事务就是保证这两个关键操作要么都成功要么都要失败。 public class OrdersService {private AccountDao accountDao; ​public void setOrdersDao(AccountDao accountDao) {this.accountDao accountDao;} ​Transactional(propagation Propagation.REQUIRED,isolation Isolation.DEFAULT, readOnly false, timeout -1)public void accountMoney() {//小红账户多1000accountDao.addMoney(1000,xiaohong);//模拟突然出现的异常比如银行中可能为突然停电等等//如果没有配置事务管理的话会造成小红账户多了1000而小明账户没有少钱int i 10 / 0;//小王账户少1000accountDao.reduceMoney(1000,xiaoming);} } 另外数据库事务的 ACID 四大特性是事务的基础下面简单来了解一下。 2. 事务的特性ACID了解么? 原子性Atomicity 一个事务transaction中的所有操作或者全部完成或者全部不完成不会结束在中间某个环节。事务在执行过程中发生错误会被回滚Rollback到事务开始前的状态就像这个事务从来没有执行过一样。即事务不可分割、不可约简。 一致性Consistency 在事务开始之前和事务结束以后数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 隔离性Isolation 数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别包括未提交读Read uncommitted、提交读read committed、可重复读repeatable read和串行化Serializable。 持久性Durability: 事务处理结束后对数据的修改就是永久的即便系统故障也不会丢失。 3. 详谈 Spring 对事务的支持 再提醒一次你的程序是否支持事务首先取决于数据库 比如使用 MySQL 的话如果你选择的是 innodb 引擎那么恭喜你是可以支持事务的。但是如果你的 MySQL 数据库使用的是 myisam 引擎的话那不好意思从根上就是不支持事务的。 这里再多提一下一个非常重要的知识点 MySQL 怎么保证原子性的 我们知道如果想要保证事务的原子性就需要在异常发生时对已经执行的操作进行回滚在 MySQL 中恢复机制是通过 回滚日志undo log 实现的所有事务进行的修改都会先先记录到这个回滚日志中然后再执行相关的操作。如果执行过程中遇到异常的话我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可并且回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况当用户再次启动数据库的时候数据库还能够通过查询回滚日志来回滚将之前未完成的事务。 3.1. Spring 支持两种方式的事务管理 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)声明式事务管理 推荐使用代码侵入性最小实际是通过 AOP 实现基于Transactional 的全注解方式使用最多。 使用 Transactional注解进行事务管理的示例代码如下 Transactional(propagationpropagation.PROPAGATION_REQUIRED) public void aMethod {//do somethingB b new B();C c new C();b.bMethod();c.cMethod(); } 3.2. Spring 事务管理接口介绍 Spring 框架中事务管理相关最重要的 3 个接口如下 PlatformTransactionManager 平台事务管理器Spring 事务策略的核心。 TransactionDefinition 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)。 TransactionStatus 事务运行状态。 我们可以把 PlatformTransactionManager 接口可以被看作是事务上层的管理者而 TransactionDefinition 和 TransactionStatus 这两个接口可以看作是事务的描述。 PlatformTransactionManager 会根据 TransactionDefinition 的定义比如事务超时时间、隔离级别、传播行为等来进行事务管理 而 TransactionStatus 接口则提供了一些方法来获取事务相应的状态比如是否新事务、是否可以回滚等等。 3.2.1. PlatformTransactionManager:事务管理接口 Spring 并不直接管理事务而是提供了多种事务管理器 。Spring 事务管理器的接口是 PlatformTransactionManager 。 通过这个接口Spring 为各个平台如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了对应的事务管理器但是具体的实现就是各个平台自己的事情了。 PlatformTransactionManager 接口的具体实现如下: 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; } ​ 这里多插一嘴。为什么要定义或者说抽象出来PlatformTransactionManager这个接口呢 主要是因为要将事务管理行为抽象出来然后不同的平台去实现它这样我们可以保证提供给外部的行为不变方便我们扩展。我前段时间分享过“为什么我们要用接口” 3.2.2. TransactionDefinition:事务属性 事务管理器接口 PlatformTransactionManager 通过 getTransaction(TransactionDefinition definition) 方法来得到一个事务这个方法里面的参数是 TransactionDefinition 类 这个类就定义了一些基本的事务属性。 那么什么是 事务属性 呢 事务属性可以理解成事务的一些基本配置描述了事务策略如何应用到方法上。 事务属性包含了 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(); } 3.2.3. TransactionStatus:事务状态 TransactionStatus接口用来记录事务的状态 该接口定义了一组方法,用来获取或判断事务的相应状态信息。 PlatformTransactionManager.getTransaction(…)方法返回一个 TransactionStatus 对象。 TransactionStatus 接口接口内容如下 public interface TransactionStatus{boolean isNewTransaction(); // 是否是新的事务boolean hasSavepoint(); // 是否有恢复点void setRollbackOnly();  // 设置为只回滚boolean isRollbackOnly(); // 是否为只回滚boolean isCompleted; // 是否已完成 } 3.3. 事务属性详解 实际业务开发中大家一般都是使用 Transactional 注解来开启事务很多人并不清楚这个参数里面的参数是什么意思有什么用。为了更好的在项目中使用事务管理强烈推荐好好阅读一下下面的内容。 3.3.1. 事务传播行为 事务传播行为是为了解决业务层方法之间互相调用的事务问题。 当事务方法被另一个事务方法调用时必须指定事务应该如何传播。例如方法可能继续在现有事务中运行也可能开启一个新事务并在自己的事务中运行。 举个例子 我们在 A 类的aMethod方法中调用了 B 类的 bMethod() 方法。这个时候就涉及到业务层方法之间互相调用的事务问题。如果我们的 bMethod()如果发生异常需要回滚如何配置事务传播行为才能让 aMethod()也跟着回滚呢这个时候就需要事务传播行为的知识了如果你不知道的话一定要好好看一下。 不过如此为了方便使用Spring 会相应地定义了一个枚举类Propagation package org.springframework.transaction.annotation; ​ import org.springframework.transaction.TransactionDefinition; ​ public enum Propagation { ​REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED), ​SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS), ​MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY), ​REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW), ​NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED), ​NEVER(TransactionDefinition.PROPAGATION_NEVER), ​NESTED(TransactionDefinition.PROPAGATION_NESTED); ​ ​private final int value; ​Propagation(int value) {this.value value;} ​public int value() {return this.value;} ​ } ​ 正确的事务传播行为可能的值如下 1.TransactionDefinition.PROPAGATION_REQUIRED 使用的最多的一个事务传播行为我们平时经常使用的Transactional注解默认使用就是这个事务传播行为。如果当前存在事务则加入该事务如果当前没有事务则创建一个新的事务。也就是说 如果外部方法没有开启事务的话Propagation.REQUIRED修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。 如果外部方法开启事务并且被Propagation.REQUIRED的话所有Propagation.REQUIRED修饰的内部方法和外部方法均属于同一事务 只要一个方法回滚整个事务均回滚。 举个例子如果我们上面的aMethod()和bMethod()使用的都是PROPAGATION_REQUIRED传播行为的话两者使用的就是同一个事务只要其中一个方法回滚整个事务均回滚。 Class A {Transactional(propagationpropagation.PROPAGATION_REQUIRED)public void aMethod {//do somethingB b new B();b.bMethod();} } ​ Class B {Transactional(propagationpropagation.PROPAGATION_REQUIRED)public void bMethod {//do something} } 2.TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新的事务如果当前存在事务则把当前事务挂起。也就是说不管外部方法是否开启事务Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。 举个例子如果我们上面的bMethod()使用PROPAGATION_REQUIRES_NEW事务传播行为修饰aMethod还是用PROPAGATION_REQUIRED修饰的话。如果aMethod()发生异常回滚bMethod()不会跟着回滚因为 bMethod()开启了独立的事务。但是如果 bMethod()抛出了未被捕获的异常并且这个异常满足事务回滚规则的话,aMethod()同样也会回滚因为这个异常被 aMethod()的事务管理机制检测到了。 Class A {Transactional(propagationpropagation.PROPAGATION_REQUIRED)public void aMethod {//do somethingB b new B();b.bMethod();} } ​ Class B {Transactional(propagationpropagation.REQUIRES_NEW)public void bMethod {//do something} } 3.TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务则创建一个事务作为当前事务的嵌套事务来运行如果当前没有事务则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。也就是说 在外部方法未开启事务的情况下Propagation.NESTED和Propagation.REQUIRED作用相同修饰的内部方法都会新开启自己的事务且开启的事务相互独立互不干扰。 如果外部方法开启事务的话Propagation.NESTED修饰的内部方法属于外部事务的子事务外部主事务回滚的话子事务也会回滚而内部子事务可以单独回滚而不影响外部主事务和其他子事务。 这里还是简单举个例子 如果 aMethod() 回滚的话bMethod()和bMethod2()都要回滚而bMethod()回滚的话并不会造成 aMethod() 和bMethod()2回滚。 Class A {Transactional(propagationpropagation.PROPAGATION_REQUIRED)public void aMethod {//do somethingB b new B();b.bMethod();b.bMethod2();} } ​ Class B {Transactional(propagationpropagation.PROPAGATION_NESTED)public void bMethod {//do something}Transactional(propagationpropagation.PROPAGATION_NESTED)public void bMethod2 {//do something} } 4.TransactionDefinition.PROPAGATION_MANDATORY 如果当前存在事务则加入该事务如果当前没有事务则抛出异常。mandatory强制性 这个使用的很少就不举例子来说了。 若是错误的配置以下 3 种事务传播行为事务将不会发生回滚这里不对照案例讲解了使用的很少。 TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务则加入该事务如果当前没有事务则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行如果当前存在事务则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行如果当前存在事务则抛出异常。 3.3.2 事务隔离级别 TransactionDefinition 接口中定义了五个表示隔离级别的常量 public interface TransactionDefinition {......int ISOLATION_DEFAULT -1;int ISOLATION_READ_UNCOMMITTED 1;int ISOLATION_READ_COMMITTED 2;int ISOLATION_REPEATABLE_READ 4;int ISOLATION_SERIALIZABLE 8;...... } 和事务传播行为这块一样为了方便使用Spring 也相应地定义了一个枚举类Isolation public enum Isolation { ​DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), ​READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), ​READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), ​REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), ​SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE); ​private final int value; ​Isolation(int value) {this.value value;} ​public int value() {return this.value;} ​ } 下面我依次对每一种事务隔离级别进行介绍 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 的隔离级别。所有的事务依次逐个执行这样事务之间就完全不可能产生干扰也就是说该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 因为平时使用 MySQL 数据库比较多这里再多提一嘴 MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ可重读。我们可以通过SELECT tx_isolation;命令来查看MySQL 8.0 该命令改为SELECT transaction_isolation; mysql SELECT tx_isolation; ----------------- | tx_isolation | ----------------- | REPEATABLE-READ | ----------------- 这里需要注意的是与 SQL 标准不同的地方在于 InnoDB 存储引擎在 REPEATABLE-READ可重读 事务隔离级别下使用的是 Next-Key Lock 锁算法因此可以避免幻读的产生这与其他数据库系统(如 SQL Server)是不同的。所以说 InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ可重读 已经可以完全保证事务的隔离性要求即达到了 SQL 标准的 SERIALIZABLE(可串行化) 隔离级别。 因为隔离级别越低事务请求的锁越少所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容) :但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ可重读 并不会什么任何性能上的损失。 3.3.3. 事务超时属性 所谓事务超时就是指一个事务所允许执行的最长时间如果超过该时间限制但事务还没有完成则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间其单位是秒默认值为-1。 3.3.3. 事务只读属性 package org.springframework.transaction; ​ import org.springframework.lang.Nullable; ​ public interface TransactionDefinition {......// 返回是否为只读事务默认值为 falseboolean isReadOnly(); ​ } 对于只有读取数据查询的事务可以指定事务类型为 readonly即只读事务。只读事务不涉及数据的修改数据库会提供一些优化手段适合用在有多条数据库查询操作的方法中。 很多人就会疑问了为什么我一个数据查询操作还要启用事务支持呢 拿 MySQL 的 innodb 举例子根据官网 MySQL :: MySQL 5.7 Reference Manual :: 14.7.2.2 autocommit, Commit, and Rollback 描述 MySQL 默认对每一个新建立的连接都启用了autocommit模式。在该模式下每一个发送到 MySQL 服务器的sql语句都会在一个单独的事务中进行处理执行结束后会自动提交事务并开启一个新的事务。 但是如果你给方法加上了Transactional注解的话这个方法执行的所有sql会被放在一个事务中。如果声明了只读事务的话数据库就会去优化它的执行并不会带来其他的什么收益。 如果不加Transactional每条sql会开启一个单独的事务中间被其它事务改了数据都会实时读取到最新值。 分享一下关于事务只读属性其他人的解答 如果你一次执行单条查询语句则没有必要启用事务支持数据库默认支持 SQL 执行期间的读一致性 如果你一次执行多条查询语句例如统计查询报表查询在这种场景下多条查询 SQL 必须保证整体的读一致性否则在前条 SQL 查询之后后条 SQL 查询之前数据被其他用户改变则该次整体的统计查询将会出现读数据不一致的状态此时应该启用事务支持 3.3.4. 事务回滚规则 这些规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下事务只有遇到运行期异常RuntimeException 的子类时才会回滚Error 也会导致事务回滚但是在遇到检查型Checked异常时不会回滚。 如果你想要回滚你定义的特定的异常类型的话可以这样 Transactional(rollbackFor MyException.class) 3.4. Transactional 注解使用详解 1) Transactional 的作用范围 方法 推荐将注解使用于方法上不过需要注意的是该注解只能应用到 public 方法上否则不生效。 类 如果这个注解使用在类上的话表明该注解对该类中所有的 public 方法都生效。 接口 不推荐在接口上使用。 2) Transactional 的常用配置参数 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 的常用配置参数总结只列巨额 5 个我平时比较常用的 属性名说明propagation事务的传播行为默认值为 REQUIRED可选的值在上面介绍过isolation事务的隔离级别默认值采用 DEFAULT可选的值在上面介绍过timeout事务的超时时间默认值为-1不会超时。如果超过该时间限制但事务还没有完成则自动回滚事务。readOnly指定事务是否为只读事务默认值为 false。rollbackFor用于指定能够触发事务回滚的异常类型并且可以指定多个异常类型。 3)Transactional 事务注解原理 面试中在问 AOP 的时候可能会被问到的一个问题。简单说下吧 我们知道Transactional 的工作机制是基于 AOP 实现的AOP 又是使用动态代理实现的。如果目标对象实现了接口默认情况下会采用 JDK 的动态代理如果目标对象没有实现了接口,会使用 CGLIB 动态代理。 多提一嘴createAopProxy() 方法 决定了是使用 JDK 还是 Cglib 来做动态代理源码如下 public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { ​Overridepublic AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {Class? targetClass config.getTargetClass();if (targetClass null) {throw new AopConfigException(TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.);}if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {return new JdkDynamicAopProxy(config);}return new ObjenesisCglibAopProxy(config);}else {return new JdkDynamicAopProxy(config);}}....... } 如果一个类或者一个类中的 public 方法上被标注Transactional 注解的话Spring 容器就会在启动的时候为其创建一个代理类在调用被Transactional 注解的 public 方法的时候实际调用的是TransactionInterceptor 类中的 invoke()方法。这个方法的作用就是在目标方法之前开启事务方法执行过程中如果遇到异常的时候回滚事务方法调用完成之后提交事务。 TransactionInterceptor 类中的 invoke()方法内部实际调用的是 TransactionAspectSupport 类的 invokeWithinTransaction()方法。由于新版本的 Spring 对这部分重写很大而且用到了很多响应式编程的知识这里就不列源码了。 4)Spring AOP 自调用问题 若同一类中的其他没有 Transactional 注解的方法内部调用有 Transactional 注解的方法有Transactional 注解的方法的事务会失效。 这是由于Spring AOP代理的原因造成的因为只有当 Transactional 注解的方法在类以外被调用的时候Spring 事务管理才生效。 MyService 类中的method1()调用method2()就会导致method2()的事务失效。 Service public class MyService { ​ private void method1() {method2();//...... } Transactionalpublic void method2() {//......} } 解决办法就是避免同一类中自调用或者使用 AspectJ 取代 Spring AOP 代理。 5) Transactional 的使用注意事项总结 Transactional 注解只有作用到 public 方法上事务才生效不推荐在接口上使用 避免同一个类中调用 Transactional 注解的方法这样会导致事务失效 正确的设置 Transactional 的 rollbackFor 和 propagation 属性否则事务可能会回滚失败 ......
http://www.pierceye.com/news/201110/

相关文章:

  • 网站模板 代码免费建设部网站有项目经理资质查询系统
  • 网站建设注意哪些方面wordpress 做手机站
  • 淄博网站制作定制推广网站程序源代码
  • 二手房地产中介网站建设wordpress改背景图片
  • 可以自己做安卓app的网站Wordpress会员插件出错
  • 做网站优化有前景吗可信网站验证服务中心
  • 韩国设计欣赏网站天津工程建设网官方网站
  • 微网站建设多少钱网站空间管理
  • 济南网站制作定制公司wordpress重新安装主题
  • python 网站开发教程怎么做网站跳转
  • 个人盈利网站怎么建立网站建设 深圳 凡科
  • 网站后台登录地址滨州论坛网站建设
  • 怎么给钓鱼网站做防红wordpress插件合集
  • 骆驼网站建设is_category wordpress
  • 网站中链接怎么做的怎么做资源网站
  • 石家庄建站模板搭建cdr做网站分辨率
  • 学校网站建设有限公司长春网站设计策划书
  • 大连网站建设流程图龙信建设集团网站
  • 徐州好点的做网站的公司深圳做商城网站建设
  • 上海龙象建设集团公司网站网站浮动咨询代码
  • 网站制作培训学校手机网站可以做动态吗
  • 企业推广网站网站开发页面怎么进
  • 嘉兴平湖网站建设网站的底部导航栏怎么做
  • 景安 怎么把网站做别名山东新华电脑学院学网站开发
  • 网站开发好还是app好wordpress 禁用修订
  • win7云主机怎么做网站贵州建设监理网站培训通知栏
  • 制作网站免费建站成都设计公司deanzhang
  • 10个网站用户体验优化的研究结果免费图片设计
  • 做明星网站打广告新闻20条摘抄大全
  • 佛山提供网站设计方案公司wordpress 2.0漏洞