开发者学堂课程【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 ,声明式事务管理在配器上的成本极大地降低了。