1.當你對數據庫多表操作出現錯誤的時候.用事務就可以回滾錯誤..比如你A表和B表是關聯表..你同時要更新A表和B表的信息.如果更新A表數據出現錯誤.如果用事務他將回滾.如果沒用事務他將直接更新B表.兩表之間就會出現關聯錯誤.
2.spring有自己的exception機制.
3.是業務層拋到dao層..業務層是在dao層之下的.
4.這兩者沒關係..
5.<prop key="save*">表示所有save*的方法都會觸發事務,同理其他prop的key值都代表你的方法名.如果不回滾就不要把方法名取叫save或者save*(*是通配符)
2.spring有自己的exception機制.
3.是業務層拋到dao層..業務層是在dao層之下的.
4.這兩者沒關係..
5.<prop key="save*">表示所有save*的方法都會觸發事務,同理其他prop的key值都代表你的方法名.如果不回滾就不要把方法名取叫save或者save*(*是通配符)
解决方案 »
- jquery ajax post返回的中文值是乱码?
- AxisFault java.lang.NullPointerException异常
- 拿session的值
- 关于用HQL语句写跨日期查询的问题
- jbpm问题
- 刚学完Struts想学Spring和Hibernate给我点建议
- 高分提问,编写一个可以访问sql server 2000的jsp,利用Tomcat执行它,很简单的功能
- 十分有用的代码:检测服务器环境的JSP Info
- 15天,能学到什么?来者有分
- 菜鸟请教:什么叫回叫函数?具体作用是什么?
- struts1.2 actionForm如何获得选中radio的值
- 请问这样算关闭数据库连接没有?Hibernate+Spring
2:spring是不是根据SqlException来工作?
3:是不是要把dao层的异常都抛到业务层才起作用?
4:如果业务层把异常都catch了,或者是抛掉了,那spring事务管理还起作用吗?
5:spring如何知道我怎样处理事务呢?怎么知道我要什么情况下回滚事务,什么情况下不回滚? 希望有人详细说说,谢谢了!上次也看了下
1、类似与ejb中的容器管理事务,即在同一操作中,要么全部成立提交,要么有excetpion都不提交(回滚)
2、好像是的吧,封装了JTA不敢确定,因为也没研究过spring代码
3、这看应用了,总之是往外抛
4、有啊,他是内部的,先是它在是你的程序
5、上面的配置,不是由spring来管理事务了吗?
所谓的事务就是数据库的事务,框架不过是对数据库事物的封装,类似于JDBC对不同数据库的驱动进行封装一样;
事务无非就是数据的一致性,以及隔离级别,传播属性等等几个老到不能再老的事务原则~~一致性无非就是上面说的即在同一操作中,要么全部成立提交,要么有excetpion都不提交(回滚);
隔离级别是对数据存在缓存的时候,更新四度快慢的问题,更新快浪费内存,更新慢会有脏数据,这个设置仁者见仁,智者见智;
传播属性,可以设置只读或又读又写,当然查询的时候设置成只读,那样效率可以提升一倍,一般设置传播,是提升效率的,和缓存一起用用得好的话可以超越JDBC的速度;他可以设置事务创建问题和操作问题;
在给你解释解释代码!~~~~其实配置文件和写代码一样,有规律滴<bean id="myTransactionManager"
//~你自己写的单词,myTransactionManage,这个Manage单词啥意思,不就是管理人吗~~这段的意思是所有事物的管理者!~
class="org.springframework.orm.hibernate.HibernateTransactionManager">
//添加对应的类,这没啥好说的;
<property name="sessionFactory">
//注入你hibernate以及数据源的那些资料,sessionFactory看着名字,看也知道hibernate,其实spring设置名字挺人性化的;,要像正常人一样思维;
<ref local="mySessionFactory"/>
</property>
</bean>
<bean id="postService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="myTransactionManager"/>
</property>
<property name="target">
<ref local="业务层的一个类"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">
PROPAGATION_REQUIRED
</prop>
<prop key="get*">
PROPAGATION_REQUIRED
</prop>
</props>
</property>
</bean> 你的具体事务:<bean id="postService"
上面的事务管理相当于黑社会老大,黑社会老大总要有小弟吧,这个就是他的小弟!~
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
//具体的类
<property name="transactionManager">
//这个小弟总要知道,他是跟哪个老大混的吧,把它设置到事务管理里面去
<ref local="myTransactionManager"/>
</property>
<property name="target">
//这单词啥意思~~target,目标的意思,目标是啥,就是目标类,就是那个作为原本作为代理的那个实例,AOP的动态代理,好好看看通知(Advice)是怎么配的,他也有target这个属性,和这个
意思一样;
<ref local="业务层的一个类"/>
</property>
<property name="transactionAttributes">
//设置传播属性的,我上面不是说了传播属性是啥了吗
<props>
<prop key="save*">
PROPAGATION_REQUIRED
//这个的意思,有事务就用,没有事务就创建一个;
默认是可读可写;如果readOnly就只是可读了
</prop>
<prop key="get*">
PROPAGATION_REQUIRED
</prop>
</props>
</property>
</bean> 再有,别在spring的持久化层catch,它本身AOP就是为了让你不用写catch语句,所以在顶层封装好了,用模板过滤器HibernateTemplate,
你自己catch语句,那还要框架干什么,框架的意义是节省程序员的代码,你反而弄多了;问,事务什么时候回滚,不回滚,自己去试验;
把这段bean去掉;
<bean id="postService"
....
show_sql语句会显示数据递交到数据库了,但是数据库根本会有这条记录,这啥意思,就是没具体事务呗!然后再把这个bean也去掉,两个都去掉;
<bean id="myTransactionManager"
.....
然后一切正常了.会使用默认事务,默认事务就是运行时异常回滚,检查异常不回滚~~~明白了没~~~可累死我了
是模板HibernateTemplate,
抱歉,别被我那错别字给误导了~~
<ref local="..."/>
</property> 是不是说指定的target类里不能自己补捉异常?
如果你的切面设置在DAO层上,那么可以理解为target类不用自己捕捉异常;
<prop key="save*">
PROPAGATION_REQUIRED
</prop>
是说target类的以SAVE开头的方法都是一个事务吗?即回滚时一起回滚是吧?