声明式事务讲解| 学习笔记

开发者学堂课程【Java Web 开发系列课程:Spring 框架入门声明式事务讲解

 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/538/detail/7351


声明式事务讲解

 

内容简介:

一、接口  Connection

二、配置  sqlSessionFactory

三、事务的传播特性

四、使用 TransactionTemplate

五、选择原则

 

一、接口 Connection

所有超级接口:

public intertnos Connection extends Wrapper

与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

Connection 对象的数据库能够担供述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是使用 getheMetaData 方法获得的。

注:在配置 Connection 时, JDBC 应用程序应该使用适当的 Connection 方法,比如 setAutoCommit 或 setTransactionIsolation 。在有可用的  JDBC 方法时,用程序不能直接调用 SQL 命令更改连接的配置。默认情况下, Connection 对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。

如果禁用了自动提交模式,那么要提交更改就必须显式调用 commit 方法;否则无法保存数据库更改。

使用 JDBC21 核心 API 创建的新 Connection 对象有一个与之关联的最初为空的类型映射。用户可以为此类型映射中的 UDT 输入一个自定义映射关系。在使用 ResultSet.getObject 方法从数据源中获取 UDT 时, getObject 方法将检查该连接的类型映射是否有对应该 UDT 的条目。

如果有,那么 getObject 方法将该 UDT 映射到所指示的类。如果没有条目,则使用标准映射关系映射该 UDT 。

用户可以创建一个新的类型映射,该映射是一个 java.util.Map 对象,可在其中创建一个条目,并将该条目传递给可以执行自定义映射关系的 java.sql 方法。

在这种情况下,该方法将使用给定的类型映射,而不是与连接关联的映射。

例如,以下代码片段指定  SQL 类型 ATHLETES 将被映射到 Tava 编程语言中的 Athletes 类。该代码片段为 Connection  对象 con 获取类型映射,并在其中插入条目,然后使用新的条目将该类型映射设置为连接的类型映射。

 

二、配置 sqlSessionFactory

class="org.mybatis.spring.SqlSessionfactoryBean">

value="classpath.mybatis.cfg.xml"/>

class="org.mybatis.spring.SqlSessionTemplate">


三、事务的传播特性

I.PROPAGATIONREQUIRED :如果存在一个事务,则支持当前事务。如果没有事务则开启。

2.PROPAGATIONSUPPORTS :如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

3.PROPAGATION MANDATORY :如果已经存在一个事务。支持当前事务。如果没有一个活动的事务,则括出异常。

4.PROPAGATION REQUIIRESNEW :总是开启一个新的事务。如果一个事劳已经存在,则将这个存在的事务持起。

5.PROPAGATION NOT SUPPORTED :总是非事务地执行,并挂起任何存在的事务。

6.PROPAGATIONNEVER:总是非事劳地执行,如果存在一个活动事务,那抛出导常。

7,PROPAGATION NESTED:如果一个活动的事务存在。则运行在一个嵌套的事务中,如果没有活动事务,则按 TransactionDefinition.PROPAGATION REQUIRED 属性执行。

 

四、使用 TransactionTemplate

TranaaetionTeplate 采用与 Spring 中别的模同样的方法,如 TdheTemplate 。它使用调机制,将应用代码从样板式的造源获取和舞能代码中解放出来,这样写出的代码座目的驱动的,把精力集中在开发者想要做的事情上。

注意:

效像你马上要在后面的例子中看到的那样使用 TramenctionTenplate 绝对会增加你的代码与 Spring 的事务框架和API间的耦合。到底编程式事务管理是不是适合你的项目需要由你自己来决定。

应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用 TramactionTenplate 你作为一个应用程序员,会写一个 TransactionCallback 的实现,通常会用名类来实现)这样的实现会包含所以你需要在该事劳上下文中执行的代码。然后你会把一个你自己实现 TransactioeCallback 的实例传运给TransnctionTemplate暴露的excoutel.) 方法。

publie class SimpleService implements Service{

single TransactionTemplate shared anongst all methods in this instance private finnl TransactionTemplate transactionTemplate

use constructor injectian to supply the PlatformTransactionManager

public SimpleService(PlatformTransactionManager

transactionMenager)

Assert.notNull(transactionManager,"The'transactionManager’ argunent mst not be null.")

this.transactionTemplate=new TransactionTemplate(transactionManager);

publie Object someServiceMethod)){

return transactionTemplate.execute(new Transaction

The code in this method executes in e transactional context. public Object doInTransaction(TransactionStatus status)( updateOperation1()

return resultOfUpdateOperation2();

}

}

}

}

 

五、选择原则

选择编程式事务管理还是声明式事务管理

当你只有很少的事务操作时,编程式事务管理通常比较合适。例如,如果你有一个 Web 用,其中只有特定的更新操作有事务要求,你可能不用使用 Spring 或其他技术设置事务代理。这种情况下,使用 TransaotionTemplate 可能是个好办法。只有编程式事务管理才能显式的设置事务名称。

另一方面,如果你的应用中存在大量事务操作。那么声明式事务管理通常是值得的。它将事务管理与业务逻辑分离,而且在 Spring 中配置也不难。使用 Spring ,而不是 EBCMT ,声明式事务管理在配器上的成本极大地降低了。

上一篇:深入Vue2.0底层思想–模板渲染


下一篇:chrome 和 safari 广告插件拦截了我的div