说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

问个关于关个spring事务的简单问题

编辑:说三道四文库 发布时间:2017-01-21 11:39
HTML文档下载 WORD文档下载 PDF文档下载

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

<!--txProxyTemplate--> 
   <bean id="txProxyTemplate" abstract="true"   class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="del*">PROPAGATION_REQUIRED</prop>
                <prop key="change*">PROPAGATION_REQUIRED</prop> 
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property> 
 </bean>
<bean id="menuDAO" class="kohisa.cn.dao.impl.MenuDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="menuService" class="kohisa.cn.service.impl.MenuService">
<property name="menuDAO">
<ref bean="menuDAO"/>
</property>
</bean>
      <bean id="menuServiceProxy" parent="txProxyTemplate" >
        <property name="target">
            <ref bean="menuService"/>
        </property>
    </bean>
<bean id="menuAction" class="kohisa.cn.action.MenuAction">
<property name="menuServiceProxy">
<ref bean="menuServiceProxy"/>
</property>
</bean>

这么配置对劲不,这个事务是什么玩应啊,是不是就是用不自己去commit?
getHibernateTemplate和SPRING的事务有关系没啊?
配置声明式事务,在代码里就不用管事务了(代码简洁了点)
getHibernateTemplate跟spring事务没关系,只不过HibernateTemplate又对session做了封装
不再用手动关闭session,也不再用从SessionFactory中拿session
还有:比如你在以一个UserManager里面需要保存一个user,可能你之前的做法是先得到session,然后session.save(user);
又有一个需求,在保存user的时候顺便记录下user的操作,在UserManager代码里面可能还要假如下面:
LogManager logManager = new LogManager();
Log log = new Log();
log.setType("DELETE");
log.setUser(user);
log.setDate(new Date());
logManager.save(log);
然而LogManager里的save方法也是需要session的,我们要求是user与log要同时保存成功或失败
但你根本没办法保证UserManager与LogManager里的session是同一个session(当然用SessionFactory的getCurrentSession()方法也是可以的),所以可能就出错了
用getHibernateTemplate就能保证session不会丢失,其实本质还是session.save(),可以看源代码去
说明一下:要是用SessionFactory的getCurrentSession()的话还要在hibernate.cfg.xml加上

<!--本地事务-->
<property name="hibernate.current_session_context_class">thread</property>
<!--JTA用下面这个,我不懂这个--->
<property name="hibernate.current_session_context_class">jta</property>

总之:我觉得getHibernateTemplate()经常是跟spring的声明式事务一起使用让人觉得它跟事务有关,其实就是为了让我们的一些操作简单化而已,
也就是simplifies Hibernate data access
我认识只能到这里了,希望有高人继续,呵呵
首先多謝樓上,講地很明白。
我剛才又去試了試,重新試了下,但是這個事務不回滾啊,要不就是我的測試方法有問題。
applicationContext.xml

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

  <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
    <bean
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>userService</value>
            </list>
          </property>
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>

<bean id="userDAO" class="kohisa.cn.dao.impl.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

<bean id="userService" class="kohisa.cn.service.impl.UserService" >
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
<bean id="myDwr" class="kohisa.cn.dwr.MyDwr">
<property name="userService">
<ref bean="userService"/>
</property>
</bean>






UserService類
public class UserService implements IUserService {
public UserService(){}
private IUserDAO userDAO;
public IUserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(IUserDAO userDAO) {
this.userDAO = userDAO;
}
public void save(Users users){
userDAO.save(users);
userDAO.save(null);我讓這地方傳個空出錯,然後上邊那條記錄好回滾。。不知道這樣對不。
}
}
UserDAO類
public class UserDAO extends HibernateDaoSupport implements IUserDAO {
public UserDAO(){}
public void save(Users user){
getHibernateTemplate().save(user);
}
}
main方法
public static void main(String args[]) throws UnsupportedEncodingException{
IUserService userService = (IUserService)ApplicationContextUtil.getApplicationContext().getBean("userService");
                Users users = new Users();
                users.setName("abc");
userService.save(users);
}

總是有一條記錄插了進去,不回滾啊。
不知道我上面的配置是不是有問題,還是測試方法有問題,請達人指點啊能測試回滾的方法。。
我靠,原來不回滾是我表的問題,改成innodb就好了..
会不会是别的save方法也启用事务了呢?我也学spring不久,不是很能看明白你的配置文件,因为现在应该用<aop:config>这种方式了
给你改了一下(搞不好spring2以后才可以用,如果你的版本太低就别往下看了)

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!-- 配置sessionFactory -->
<bean name="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="allServiceMethod"
expression="execution(* kohisa.cn.service.impl.UserService .*(..))" />
<aop:advisor advice-ref="txAdvice"
pointcut-ref="allServiceMethod" />
</aop:config>

        <bean id="userDAO" class="kohisa.cn.dao.impl.UserDAO">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    
    <bean id="userService" class="kohisa.cn.service.impl.UserService" >
        <property name="userDAO">
            <ref bean="userDAO"/>
        </property>
    </bean>
    <bean id="myDwr" class="kohisa.cn.dwr.MyDwr">
        <property name="userService">
            <ref bean="userService"/>
        </property>
    </bean>
</beans>
表或查询是否存在-VB资料 不创建DSN直接在程序中使用ODBC数据源-VB资料 不用 DATA 控件操作数据库文件 -VB资料 不用 EOF 以加快记录循环-VB资料 处理Select语句中的单引号 -VB资料 断开所有的数据连接 -VB资料 访问VB外来数据库 非access数据库在vb中的编程及应用 关闭程序中所有创建的数据库连接。 -VB资料 关闭所有的数据连接 -VB资料 关于数据报表的打印设置-VB资料 VB建立、改变及重构Access数据库-VB资料 结构化查询语言(SQL)详解之一-VB资料 利用VB使ACCESS数据库在网络使用中保持同步 返回 连接Data到多个表单-VB资料 列出 SQL Server 数据库中所有的存储过程-VB资料 列出MDB档当中所有table的名称-VB资料 您想知道有谁正在使用您的 Access 文件吗?(多人环境中)-VB资料 主题:浅谈Excel 的VB编程 巧用VB6的DataGrid实现通用电子表格 VB取得正确的 RecordCount 值 主題:如何动态新增、移除 ODBC DSN? -VB资料 VB如何将表中的数据导出到电子表格中 VB如何将文本文件转换为ACCESS数据库 VB如何將 Excel 的文件导入 Access文件? VB如何判断数据中是否存在某一表或查询 VB如何删除FoxPro数据库的数据? VB如何设置对VB数据库连接的动态路径 VB如何使用 ADO 來压缩或修复 Microsoft Access 文件 VB如何修改Foxpro数据库(不是用VB实现的,不过也可以看看) VB如何在 SQL 语句中使用日期? 返回 c,如何得到一个文件名中指定位置指定长度的字符串?? 服务器是否打开支持FileSystemObject对象的权限 我的数据表列宽为7个字符 , 而我只输入3个字符 , 当我输入4个字符后 , 再次运行程序却看不到所有数据 从新做人 求救:在NT Server下调用GetVolumeInformationA取分区序列号,返回结果为负数!!!怎么回事啊? 正式到新公司上班,送300分,感谢在我最困难的时候在“软件工程”版给过我帮助的朋友们!! 请问斑竹及所有人,怎样得到QuickReport的总页数? Websphere3.5的一个BUG.希望有人反对.多谢.. 什么是DAMAP的对象 哪里有 winpcap 或 libnet 及其他网络编程辅助包下载? 谁能提供PSP文档?最好是Humphrey的那本书! 代码出现bebug.请大家帮我找!!!! TO:net_lover(孟子E章),详情请入内! 有谁用过DEV express系列的dxdbgrid??它是如何把一个文本文件txt读到dxdbgrid1.columns[i]的picklist中去,作为picklist的内容的啊? 我想在Linux下做数据库开发,用什么数据好? 我的pws可能出了问题,那位高手能解决一下 关于控制winamp 各位同行你们有这个的源程序吗(Cacio DT-900数据采集器) Html Help 制作方法 luodi(无知者无畏), 请进: 我用shell(app.path+"\mdac.exe"),来调用微软数据访问控件2.0,提示出错:命令行语法错误, 求救:如何将剪贴板中的内容放到image控件上 how to get the sytax of customer user object ? jsp中的打印问题 pb中有没有类似iif之类的语句 大虾们,怎样将String 类型转换成float 请问在及时战略中,怎么实现寻路的 我想在状态栏显示时间,有没有属性可以让时间自动变化,而不用其它辅助控件? 不会没人愿意回答这个问题吧,都贴第二次了!! 吃西瓜 我在注冊自創構件時總是出錯,請各位幫忙解決. 关于ado连接sybase的问题,紧急求救!!!(我的最高分了) 29分:flexcell定位 请教一下,关于Delphi COM类型库的问题 大家来谈谈申奥成功对我们的影响吧,我想知道怎么利用这个契机大赚一笔 各位谁喜欢“后街男孩”??喜欢的给分! 请问在DBGRID中改变当前选定行的颜色? 我想在DataSourceDataChange()中实现。 客户端怎么与服务器端通信 为什么我在窗口里修改了一个记录的图片字段后,在数据窗口内不能正常显示? 我要在RedLinux71下安装WEB服务器软件,请部如何做? 如何计算某年某月的天数和每天对应的星期 help!!! 为什么我的D6在编译时出现错误:“Fatal Error QuickRpt.pas(23):File not found:'Dsgnintf.dcu' 帝国时代之农民搞笑版……哈哈 如何用DEBUG的命令取消cmos密码!!!急急急! 请教一个Redhat安装的问题 该死的创新virba128…… 急!!!给tripofdream(梦之旅)和能解决全文检索的高手! 有台WIN95机器启动是时出错缺文件mtrr.vxd,udf.vxd谁能帮我! 对于BMP图象的旋转(90、180)的处理。用BitBlt()能否实现。 《Windows网络编程技术》例子中的一个问题。 急!各位帮忙!!!!!!!!!!! 编写程序,计算圆柱体,球体,正方体和长方体的表面积和体积(提示:本题中,可先定义一 1.一个高10cm的圆柱,如果把高减少3cm,表面积就比原来减少18.84cm.这个圆柱的体积是多少立方厘米?2.把一个高8dm的圆柱体割拼成一个等底的近似长方体后,表面积增加了24dm²,圆柱体的体积是多 如图:一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是多少?图没标圆柱 正方体、长方体、圆柱体的体积都可以用S乘以H来计算对吗? 一个圆柱体底面周长是18.84cm,高是10cm,这个圆柱体的占地面积是多少? 一个圆柱体,如果把它的高截短了3厘米,表面积就减少了94.2立方CM,体积就减少了多少立方厘米 用正方体,长方体,圆柱体,球体的盒子可以拼什么东西 数学题一个圆柱体高减少4厘米,表面积减少125.6厘米,它的体积是多少? 一个圆柱的高是10cm,若高减少4cm,则表面积减少125.6平方cm,求圆柱体的体积? 一个圆柱体如果它的高截短3厘米表面积减少94.2平方厘米它的底面半径减少多少体积减少多少 把一个圆柱体的高减少4厘米后,表面积减少50.24平方厘米,求减少部分的体积 从一个圆柱上截下一个高10cm小圆柱体.表面积比原来减少了188.1平方cm截下的圆柱的体积是多少 9、一个圆柱体,如果把它的高截短3厘米,表面积就减少94.2平方厘米.它的底面半径体积减少了( )立方厘米9、一个圆柱体,如果把它的高截短3厘米,表面积就减少94.2平方厘米.它的底面半径是( 一段圆柱体钢材,截去10cm长的一段后,表面积减少了314,体积减少了( ) 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少? 一个圆柱体,如果把它的高截短3厘米,表面积就减少94.2平方厘米.它的底面半径是多少厘米?体积减少了多少立方厘米? 把一个直径是10CM的圆柱体沿直径纵向切开以后,表面积增加了100CM,原来这个圆柱的体积是多少立方厘米?把一个直径是8CM的圆柱体沿直径纵向切开以后,表面积增加了112CM,原来这个圆柱的体积是 一个底面直径是8cm,高是16cm的圆柱,如果它的高增加了10cm,它的表面积是多少? 一个圆柱体的底面半径是2cm,高5cm,它的侧面积是多少,表面积是多少,体积是多少列出算式 一个圆柱体的高是10CM,如果高减少4CM,则表面积减少125·6.原来圆柱的体积是()立方厘米.最好有算式 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少?,说清每步 一个圆柱体的底面半径是4CM,高6CM,现在把这个圆柱体的高增加5CM,表面积和体积各增加多少? 一个圆柱体,如果把它的高截短3里厘米,表面积就减少94.2平方厘米,体积就减少了( )立方厘米? 把长2米的圆柱体木料锯成两段,表面积增加了6平方米,原来这个圆柱体的体积是() 一个圆柱体已知他的a=5cm h=2cm 求他的表面积和体积.(要有算式.) 一个圆柱体如果它的高截短3CM,表面积就减少94.2平方厘米,体积就减少了多少立方厘米 把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体后,表面积增加了24平方分米,把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体以后,表面积增加了24平方分 一个高为5CM的圆柱体,如果它的高增加3CM,那么它的表面积就增加18.84CM平方.原来的圆柱体的体积是多少? 一个圆柱体,如果把它的高截短2厘米,表面积就减少62.8平方厘米,体积就减少多少立方厘米?请把具体步骤都写一遍谢谢 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分把整个过程写下来 一个圆柱体的底面周长是31.4厘米,如果高增加2厘米 底面大小不变 那么表面积比原来增加了多少平方厘米一个圆柱体的底面周长是31.4厘米,如果高增加2厘米 底面大小不变 那么表面积比原来 把1张周长是80的圆柱体木柴锯成三段相等的圆柱,表面积增加了48平方厘米,原来的圆柱体木柴的体积是 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分米,原来圆柱体体积是多少 一个圆柱体的底面周长是31.4米,高增加2厘米,底面大小不变,则表面积增加了多少急用,明天就要 一个高5厘米的圆柱体,沿底面直径将圆柱体锯成两块,其表面积增加40平方厘米,原来这个圆柱的体积? 把一个高8dm的圆柱体,割拼成一个等底的近似长方体,表面积增加了24平方分米,圆柱体体积是多少? 一个圆柱体的底面周长是3.14cm,如多高增加2cm,底面大小不变,那么表面积比原来增加了多少?讲一讲,【必须列算式】 一个高为5厘米的圆柱,沿底面直径将圆柱锯成两块,其表面积增加了40平方厘米,原来这个圆柱的体积是() 圆柱体表面积公式是什么? c语言已知园半径r=1.5设圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球体积,圆柱体 一个圆柱体底面周长是31.4厘米表面积是 408.2平方厘米这个圆柱的高是多少厘米? 一个圆柱体的体积是125.6立方厘米,底面直径是4厘米,它的侧面积是多少平方厘米?2.把一个棱长是6分米的正方体木块,削成一个最大的圆柱体,这个圆柱体的体积是多少立方分米? 输入圆柱体底面的半径R,和高H,输出其表面积S和体积V 用VB输入圆柱体底面的半径R,和高H,输出其表面积S和体积V 一个圆柱体底面周长与高相等,若高减少3cm,表面积减少188.4平方厘米,求原来圆柱体体积. 一个圆柱体,高10厘米,如果高增加2厘米,它的表面积就增加12.56平方厘米,求这个圆柱的侧面积 JAVA声明圆柱体类和圆锥体类,继承矩形类rectangle并实现volume借口,计算表面积和体积要代码哦~注意继承的不是圆~ 把一个长80厘米的圆柱体,沿与底面平行方向平均裁成4段,表面积增加了188.4平方厘米,求每段的体积.详细解说一下,看不懂. 一个圆柱体侧面积是62.8平方厘米,地面积是12.56平方厘米,它的表面积是多少平方厘米? java设计:问题是编写程序计算圆柱体的体积和表面积编写程序计算圆柱体的体积和表面积.提示:1.读入半径和高.2.表面积=半径×半径×π+2×半径×π×高.3.体积=底面积×高4.注意使用的数 把一个长80厘米的圆柱体,沿与底面平行方向平均截成4段表面积增加188.4平方厘米求每段的体积 一个圆柱体,他的直径是10cm,高是10cm,它的表面积是多少? 输入圆柱体的底面半径和圆柱体的高,并计算圆柱体的表面积和体积,并输出结果 从一个圆柱体截下一段高为5CM的小圆柱后,表面积比原来减少188.4平方厘米,被截下的小圆柱的体积是多少 底面直径是4cm,高是10cm的圆柱体,表面积、侧面积和表面积分别怎么算? 已知圆柱体的直径是4厘米和高6厘米求它的表面积和体积 圆柱的底面半径是2厘米,高是5厘米,圆柱体的底面积\表面积\体积,分别是多少? 若上面圆柱表面积展开图中侧面的长是25.12cm,宽是10cm.本这个圆柱的表面积. 把长方体、正方体、圆柱体、圆锥体、球体分为两类为什么?请具体说明。如果考试?怎么办? 个高是10cm的圆柱,如果它的高减少2cm,表面积就减少18.84cm²,原来圆柱的体积是多少? 一个高为10cm的圆柱,如果他的高增加2cm,那么它的表面积就增加125.6平方厘米,求原来圆柱的表面积.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn