Spring 事务

本贴最后更新于 2586 天前,其中的信息可能已经时移俗易

Spring 事务的隔离级别

ISOLATION_DEFAULT // 默认值,指底层数据库的默认隔离级别
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE

Spring 事务的传播行为

PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。

PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。

Spring 事务超时

@Transational(timeout=x) // 单位是秒

Spring 只读事务

@Transational(read-only=true)
在这个事务里只能有数据库读操作,不能有写操作,否则会抛出异常,然后事务回滚。
true readonly 只读
false read/write 读写

Spring 事务回滚

如果在事务中抛出 RuntimeException,事务会回滚。

自动提交

数据库默认操作模式是 autocommit 自动提交模式。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。

spring 会将底层数据库连接的自动提交特性设置为 false。

当一个连接关闭时,如果有未提交的事务应该如何处理?JDBC 规范没有提及,C3P0 默认的策略是回滚任何未提交的事务。

Spring 编程式事务管理

TransactionTemplate

Spring 声明式事务管理

@Transactional(value="", read-only=true/false, timeout=x, isolation=xx.xx, propagation=xx.xx, ...)

@Transactional 可以作用于接口、接口方法、类以及类方法上。但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。

\<tx:annotation-driven transaction-manager="txManager" />
\<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <!-- 传入dataSource -->
  \<property name="dataSource" ref="dataSource" />
\</bean>
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...