在程序行下文中声明一个事务管理器
jdbc事务管理器
DataSourceTransactionManager通过datasource检索到java.sql.Connection 对象来管理事务,一个成功的事务调用当前连接commit()提交,一个失败的事务通过rollbck()回滚
<bean id="transactionManager" class="org.springframework.jdbc. datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
jpa事务管理器
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>
jto事务管理器
<bean id="transactionManager" class="org.springframework. transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager" /> </bean>
程序中使用事务管理器
public void saveSpittle(final Spittle spittle) { transactionTemplate.execute(new TransactionCallback<Void>() { //使用transctiontemplate,必须实现transactioncallback接口,该接口中只有一个function public Void doInTransaction(TransactionStatus txStatus) { try { spitterDao.saveSpittle(spittle); } catch (RuntimeException e) { txStatus.setRollbackOnly(); //回滚 throw e; } return null; } }); }
声明式事务
来源百度百科:声明式事务(Programmatic transaction management)是Spring提供的对程序事务管理的方式之一。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring中事务属性有以下四个参数:
1.传播行为
2.隔离级别
脏读: a事务写数据但未提交,b事务读取,a事务回滚,b读取的数据无效
不可重复读:a事务读取两次数据结果不同,可能另一并发事务在两次查询中改写数据
幻读取:事务在查询多条记录的过程中,数据被改写。
隔离级别:
SOLATION_DEFAULT 默认级别
ISOLATION_READ_UNCOMMITTED 允许读取尚未更改的数据,级别最低
ISOLATION_READ_COMMITTED 允许从已提交的并发事务中读取数据,可防止脏读,不可防止不可重复读和幻读
ISOLATION_REPEATABLE_READ 对相同字段的多次读取结果一致,不可防止幻读
ISOLATION_SERIALIZABLE 完全锁定当前事务涉及的table,级别最高,但是最慢
3.只读提示
如果事务只读取数据,数据库可优化,由后端数据库实施
4.事务超时期间
5. 回滚规则
定义哪些异常可引起回滚
声明事务
1 在spring2.0中声明事务
<tx:advice id="txAdvice" transaction-manager="txManager"> //使用tx命名空间 <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> //通知器,定义接受通知的bean <aop:advisor pointcut="execution(* *..SpitterService.*(..))"//实现spitterservice的所有的接口的bean advice-ref="txAdvice"/> </aop:config>
The five facets of the transaction pentagon are specified in the attributes of the <tx:method> element.
propagation 事务的传播规则isolation 事务的隔离级别
read-only 是否为只读
rollback-for 那该异常应该回滚
no-rollback-for 对于哪些异常当前事务应该继续执行而不回滚
timeout 事务超时时间
2 通过注解声明事务
在应用程序上下文中加入
<tx:annotation-driven transaction-manager="txManager" />
该注释告诉spring在类层或者方法层检查程序上下文的所有bean,寻找标注@transactional的bean,tx:annotation-driven 将自动把事务通知的内容给他
可注释在一个类上或一个接口或一个方法上
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true) public class SpitterServiceImpl implements SpitterService { ... @Transactional(propagation=Propagation.REQUIRED, readOnly=false) public void addSpitter(Spitter spitter) { ... } ... }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?