为什么我用过滤器管理事务根本不回滚?

颖辉小居 2015-11-09 02:29:05
事务过滤器
package yh.position.Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;

import yh.position.util.HibernateUtils;

/**
* 用于进行Hibernate事务处理的Servlet过滤器
*
* @author zyh 2015-10-21
*/
public class TransactionFilter implements Filter {
private static Logger log = Logger.getLogger(TransactionFilter.class);

/**
* 过滤器的主要方法 用于实现Hibernate事务的开始和提交
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

Session session = HibernateUtils.getSession();
Transaction tx = session.getTransaction();
if (!tx.isInitiator()) {
tx.begin();
}
System.out.println("----开启事物----");
try {
// 开始一个新的事务
log.info("Starting a database transaction");
// tx.begin();不注释就报错:nested transactions not supported
log.info("Request Path:\t"
+ ((HttpServletRequest) request).getServletPath());

// Call the next filter (continue request processing)
chain.doFilter(request, response);

// 提交事务
log.info("Committing the database transaction");
if (tx.isInitiator()) {
tx.commit();

}

System.out.println("----事物提交----");
} catch (Throwable ex) {
ex.printStackTrace();
try {
// 回滚事务
log.info("Trying to rollback database transaction after exception");
if (tx.isInitiator()) {
tx.rollback();
System.out.println("----回滚事务----");
}
} catch (Throwable rbEx) {
log.error("Could not rollback transaction after exception!",
rbEx);
}
// 抛出异常
throw new ServletException(ex);
} finally {
log.info("session closed");
HibernateUtils.closeSession();
}
}

/**
* Servlet过滤器的初始化方法 可以读取配置文件中设置的配置参数
*/
public void init(FilterConfig filterConfig) throws ServletException {
}

/**
* Servlet的销毁方法 用于释放过滤器所申请的资源
*/
public void destroy() {
}
}

Action
package yh.position.action.police;

import yh.position.action.BaseAction;
import yh.position.dao.impl.PoliceDaoImpl;
import yh.position.model.Police;

public class PoliceUpdatePwdAction extends BaseAction {

private static final long serialVersionUID = 1L;
private String newPwd;

public String getNewPwd() {
return newPwd;
}

public void setNewPwd(String newPwd) {
this.newPwd = newPwd;
}

@Override
public String execute() throws Exception {
int policeId = currPoliceId();

Police police = new PoliceDaoImpl().get(policeId);
police.setPwd(newPwd);
new PoliceDaoImpl().save(police);
code = 1;
message = "修改成功!";

int err = 1 / 0;

returnJson();
return SUCCESS;
}
}

结果jsp上显示了 除数为0的错误。可是控制台打印了事务的开启和提交,修改的数据也保存到数据库了。没有回滚的打印。
...全文
168 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
颖辉小居 2015-11-10
  • 打赏
  • 举报
回复
web的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name></display-name>
  <!-- 编码过滤器 -->
  <filter>
    <filter-name>charsetFilter</filter-name>
    <filter-class>yh.position.Filter.CharsetFilter</filter-class>
    <init-param>
      <param-name>codingType</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!--登陆过滤器 -->
  <filter>       
         <filter-name>loginFilter</filter-name>       
         <filter-class>yh.position.Filter.LoginFilter</filter-class>       
    </filter>       
      <filter-mapping>    
         <filter-name>loginFilter</filter-name>    
         <url-pattern>/*</url-pattern>    
  </filter-mapping> 
  <!-- 事务过滤器  --> 
  <filter>
    <description>事务的过滤器</description>
    <filter-name>TransactionFilter</filter-name>
    <filter-class>yh.position.Filter.TransactionFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>TransactionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- session监听器 -->
  <listener>
    <listener-class>yh.position.listener.OnlineUserListener</listener-class>
  </listener>
    <!-- struts2过滤器 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
颖辉小居 2015-11-09
  • 打赏
  • 举报
回复
自己顶,Spring 对hibernate4 好像不再提供事务支持了。
颖辉小居 2015-11-09
  • 打赏
  • 举报
回复
求求大家 帮帮忙啊,我用的是hibernate4 ,不会用spring管理他的事务
第一部分 数据库体系结构 第1章 Oracle体系结构 1 1.1 数据库概述及实例 1 1.2 数据库 1 1.2.1 表空间 2 1.2.2 文件 2 1.3 实例 3 1.4 数据库内部结构 3 1.4.1 表、列和数据类型 4 1.4.2 约束条件 5 1.4.3 抽象数据类型 6 1.4.4 分区和子分区 7 1.4.5 用户 7 1.4.6 模式 8 1.4.7 索引 8 1.4.8 簇 9 1.4.9 散列簇 9 1.4.10 视图 9 1.4.11 序列 10 1.4.12 过程 10 1.4.13 函数 10 1.4.14 软件包 11 1.4.15 触发器 11 1.4.16 同义词 12 1.4.17 权限及角色 12 1.4.18 数据库链接 13 1.4.19 段、盘区和块 14 1.4.20 回滚段 14 1.4.21 快照和显形图 14 1.5 内部存储结构 15 1.5.1 系统全局区 15 1.5.2 环境区 17 1.5.3 程序全局区 17 1.6 后台进程 18 1.7 外部结构 20 1.7.1 重做日志 20 1.7.2 控制文件 21 1.7.3 跟踪文件与警告日志 21 1.8 基本数据库的实现 21 1.8.1 备份/恢复功能 22 1.8.2 安全性能 23 1.8.3 典型数据库逻辑设计 24 1.8.4 典型数据库物理设计 24 1.9 逻辑模型约定 25 1.9.1 一对一关系 25 1.9.2 一对多关系 26 1.9.3 多对多关系 26 1.10 创建数据库 27 1.10.1 修改创建模板的脚本文件 27 1.10.2 创建数据库后修改 MAXDATAFILES 27 1.10.3 使用OEM 28 第2章 硬件配置研究 30 2.1 结构概述 30 2.2 独立主机 31 2.2.1 磁盘阵列独立主机 31 2.2.2 磁盘镜像独立主机 34 2.2.3 多数据库独立主机 35 2.3 网络主机 36 2.3.1 数据库网络 37 2.3.2 远程更新:高级复制选项 39 2.3.3 集群服务器:Oracle并行服务器 40 2.3.4 多处理器:并行查询和并行装载 选项 41 2.3.5 客户机/服务器数据库应用 42 2.3.6 三层体系结构 43 2.3.7 Oracle透明网关访问 44 2.3.8 备用数据库 44 2.3.9 复制型数据库 45 2.3.10 外部文件访问 45 第3章 数据库逻辑设计 47 3.1 最终产品 47 3.2 优化软结构 47 3.2.1 起点:SYSTEM表空间 47 3.2.2 分离应用程序数据段:DATA 48 3.2.3 分离应用程序索引段:INDEXES 48 3.2.4 分离工具段:TOOLS 49 3.2.5 分离回滚段:RBS 50 3.2.6 分离临时段:TEMP 50 3.2.7 分离用户:USERS 51 3.3 扩展OFA 51 3.3.1 分离低使用的数据段:DATA_2 51 3.3.2 分离低使用的索引段:INDEXS_2 52 3.3.3 分离工具索引:TOOLS_1 52 3.3.4 分离特殊回滚段:RBS_2 53 3.3.5 分离用户特殊临时段: TEMP_USER 53 3.3.6 附加的应用特殊OFA扩展 54 3.4 合理的逻辑设计 54 3.5 解决方案 55 第4章 数据库物理设计 57 4.1 数据库文件设计 57 4.1.1 数据文件间的I/O冲突 57 4.1.2 所有数据库文件中的I/O瓶颈 59 4.1.3 后台进程中的并发I/O操作 61 4.1.4 定义系统恢复能力与性能目标 61 4.1.5 系统硬件及结构镜像的定义 62 4.1.6 识别专用于数据库的磁盘 62 4.1.7 选择正确的设计 63 4.2 I/O权值估计的检验 66 4.3 如何解决磁盘不足问题 69 4.4 解决方案 70 4.4.1 小型开发数据库设计 70 4.4.2 产品OLTP数据库设计 70 4.4.3 具有历史数据的产品OLTP数据库 设计 71 4.4.4 数据仓库设计 72

67,543

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧