Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例

Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例

这篇文章主要介绍了春天实战之使用TransactionProxyFactoryBean实现声明式事务操作,结合实例形式分析了春天使用TransactionProxyFactoryBean实现声明式事务相关配置、接口设置与使用技巧,需要的朋友可以参考下

本文实例讲述了春天实战之使用TransactionProxyFactoryBean实现声明式事务操作。分享给大家供大家参考,具体如下:

一 配置文件

?可扩展标记语言版本=1.0 编码=GBK ?

bean xmlns:xsi= http://www。w3。 org/2001/XML架构-实例

xmlns= http://www。spring框架。组织/架构/bean

xmlns:p= http://www。spring框架。组织/架构/p

xsi:架构位置= http://www。spring框架。组织/模式/bean

http://www。spring框架。org/schema/beans/spring-beans-4.0。xsd

!-定义数据源豆子,使用C3P0数据源实现,并注入数据源的必要信息-

bean id= data source class= com。m零钱。v2。c3p 0。“组合工具栏数据源”

destroy-method=close

司机:司机。MySQL。JDBC。“司机”

p:JDBC URL= JDBC:MySQL://localhost/spring

p:user=root

密码=32147

p:maxPoolSize=40

p:minPoolSize=2

p:initialPoolSize=2

p:maxIdleTime=30/

!-配置JDBC数据源的局部事务管理器,使用数据源事务管理器类-

!-该类实现PlatformTransactionManager接口,是针对采用数据源连接的特定实现-

!-配置数据源事务管理器时需要依注入数据源的引用-

bean id=transactionManager

org。spring框架。JDBC。数据来源。数据源事务管理器

p:dataSource-ref=dataSource/

!-配置一个业务逻辑豆子-

bean id= newsDao class= org。疯狂吧。app。道。impl。新闻导报

p:ds-ref=dataSource/

!-为业务逻辑豆配置事务代理

transactionManager用于为配置事务代理注入所需的事务管理器

目标用于指定为哪个豆配置事务代理-

bean id=newsDaoTrans class=

org。spring框架。交易。截击机。transactionproxyfactorybean

p:事务管理器-ref=事务管理器

p:target-ref=newsDao

!-指定事务属性-

属性名=事务属性

小道具

prop key= * PROPAGATION _ REQUIRED/prop

/道具

/属性

/bean

/豆子

二 DAO

一接口

包org。疯狂吧。app。道;

公共接口新闻岛

{

公共空插入(字符串标题,字符串内容);

}

2实现类

包org。疯狂吧。app。道。impl

导入javax。SQL。数据来源;

导入Java。SQL。连接;

导入org。spring框架。JDBC。核心。JDBC模板;

导入org。疯狂吧。app。道。*;

公共类新闻报实现新闻岛

{

私有数据源ds;

公共空集合(数据源集合)

{

this.ds=ds

}

公共空的插入(字符串标题、字符串内容)

{

JdbcTemplate jt=新JDBC模板;

jt.update(insert into news_inf

值(空,)

,标题,内容);

//两次插入的数据违反唯一键约束

jt.update(insert into news_inf

值(空,)

,标题,内容);

//如果没有事务控制,则第一条记录可以被插入

//如果增加事务控制,将发现第一条记录也插不进去。

}

}

三 测试类

包李;

导入org。spring框架。语境。支持。*;

导入org。spring框架。语境。*;

导入org。疯狂吧。app。道。*;

公共课程春季考试

{

公共静态void main(String[] args)

{

//创建春天容器

应用程序上下文ctx=新建

classpathmlaplicationcontext( bean。XML’);

//获取事务代理豆

新闻道道=(新闻道)ctx。getBean(newsDaoTrans ,newsdao。类);

//执行插入操作

dao.insert(疯狂Java ,轻量级Java EE企业应用实战);

}

}

四 测试

数据库中无数据,说明事务生效。

线程“主要”组织。spring框架。道。重复键异常中出现异常:PreparedStatementCallbackSQL[插入到news_inf值(空,)];重复条目疯狂关键字"新闻标题"的“Java”;嵌套异常是com。MySQL。JDBC。例外情况。JDBC 4。mysqltigrityconstraintviolationexception:重复条目疯狂关键字"新闻标题"的" Java "

位于org。spring框架。JDBC。支持。sqlerrorcodesqlexception转换器。do translate(sqlerrorcodesqlexception translator。Java:239)

位于org。spring框架。JDBC。支持。abstractfallbacksqlexceptiontranslator。translate(abstractfallbacksqlexceptiontranslator。Java:73)

位于org。spring框架。JDBC。核心。JDBC模板。执行(JDBC模板。Java:660)

位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:909)

位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:970)

位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:980)

位于org。疯狂吧。app。道。impl。newsdaoimpl。插入(newsdaoimpl。Java:33)

位于星期日反思。nativemethodaccessorimpl。调用0(本机方法)

位于星期日反思。nativemethodaccessorimpl。调用(nativemethodaccessorimpl。Java:62)

位于星期日反思。delegatingmethodaccessorimpl。调用(delegatingmethodaccessorimpl。Java:43)

位于Java。郎。反思。方法。调用(方法。Java:498)

位于org。spring框架。AOP。支持。奥普特利斯。invokejoinpointusingreflection(aoputils。Java:317)

位于org。spring框架。AOP。框架。反射方法调用。调用连接点(反射方法调用。Java:190)

位于org。spring框架。AOP。框架。反射方法调用。继续(反射方法调用。Java:157)

位于org。spring框架。交易。截击机。交易拦截器$1。proceedwithintiation(事务拦截器。Java:98)

位于org。spring框架。交易。截击机。transactionaspectsupport。invokewithtransaction(transactionaspectsupport。Java:262)

位于org。spring框架。交易。截击机。事务拦截器。调用(事务拦截器。Java:95)

位于org。spring框架。AOP。框架。反射方法调用。继续(反射方法调用。Java:179)

位于org。spring框架。AOP。框架。jdkdynamicaopproxy。调用(jdkdynamicaopproxy。Java:207)

at com.sun.proxy.$Proxy4.insert(未知来源)

在李springtest。main(springtest。Java:28)

导致原因:com。MySQL。JDBC。例外情况。JDBC 4。MySQL integrityconstraintviolationexception:重复条目疯狂关键字"新闻标题"的" Java "

位于星期日反思。nativeconstructoraccessorimpl。新实例0(本机方法)

位于星期日反思。nativestructoraccessorimpl。新实例(nativestructoraccessorimpl。Java:62)

位于星期日反思。delegatingconstructoraccessorimpl。新实例(delegatingconstructoraccessorimpl。Java:45)

位于Java。郎。反思。构造函数。新实例(构造函数。Java:423)

位于com。MySQL。JDBC。util。handlenewinstance(util。Java:409)

位于com。MySQL。JDBC。util。getinstance(util。Java:384)

位于com。MySQL。JDBC。SQL错误。createsql异常(sql错误。Java:1039)

位于com。MySQL。JDBC。mysqlio。checkerrorpacket(mysqlio。Java:4232)

位于com。MySQL。JDBC。mysqlio。checkerrorpacket(mysqlio。Java:4164)

位于com。MySQL。JDBC。mysqlio。发送命令(mysqlio。Java:2615)

位于com。MySQL。JDBC。mysqlio。sqlquerydirect(mysqlio。Java:2776)

位于com。MySQL。JDBC。连接实现。exec SQL(连接实现。Java:2838)

位于com。MySQL。JDBC。准备好的声明。执行内部(准备好的语句。Java:2082)

位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2334)

位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2262)

位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2246)

位于com。m零钱。v2。c3p 0。impl。newproxypreparedstatement。执行update(newproxypreparedstatement。Java:147)

位于org。spring框架。JDBC。核心。JDBC模板$2。doinpreparedstatement(JDBC模板。Java:916)

位于org。spring框架。JDBC。核心。JDBC模板$2。doinpreparedstatement(JDBC模板。Java:909)

位于org。spring框架。JDBC。核心。JDBC模板。执行(JDBC模板。Java:644)

.18更

更多对java相关内容感兴趣的读者,请查看我们的专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》。

希望这篇文章对大家的java编程有所帮助。

Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例