songeddy 2014-04-06 03:41 采纳率: 0%
浏览 1931

spring注解方式事务控制没有回滚

项目中使用到了hibernate以及spring事务控制,在service层增加事务控制但是遇到异常没有回滚。
代码如下:
配置文件
<?xml version="1.0" encoding="UTF-8"?>
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.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire="byName" default-lazy-init="true">
















<!-- 字典信息 -->
com.cvicse.tech.dic.model.DCoreParam
com.cvicse.tech.dic.model.DDicContent
com.cvicse.tech.dic.model.DDicType
com.cvicse.tech.dic.model.DZoneCode
com.cvicse.tech.dic.model.DDepMode




<!-- see /components/orm/hibernate/meta/dialect.properties for all Dialect -->
${hibernate.dialect}
${hibernate.show_sql}
${hibernate.cache.provider_class}
${hibernate.cache.use_query_cache}




id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >



service层代码
@Transactional
public class LrbManager {

private LrbDAOImpl lrbDao;
private Sql sql;

@Transactional
public void delete() throws ApplicationException {
sql.setSql("insert into sjcj_lrb (SXH, XM, HC, SNTQLJ, BYS, BNLJS, JBJG, JBR, JBSJ, DWMC, SSRQ) values('5','1','1','121','1','1','1','1','2014-03-30','1','2014-03-30')");
sql.executeUpdate();
sql.setSql("insert into sjcj_lrb (SXH, XM, HC, SNTQLJ, BYS, BNLJS, JBJG, JBR, JBSJ, DWMC, SSRQ) values('6','1','1','121','1','1','1','1','2014-03-30','1','2014-03-30')");
sql.executeUpdate();

//抛异常语句
sql.setSql("delte from sjcj_lrb1 ");
sql.executeUpdate();
}
}

/**
*关于SQL语句的一些操作
*/
public class Sql extends JdbcDaoSupport {

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-01 22:16
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring的事务管理中,你已经正确地使用了@Transactional注解来定义一个方法。这个注解告诉Spring框架,对于这个方法内的代码块,我们应该执行事务处理。但是,当你尝试通过设置sql.executeUpdate()来进行数据库操作时,可能会导致问题。

    在Hibernate中,事务处理通常发生在更新、插入或删除数据后,而不是在执行SQL之前。因此,如果你想要在执行SQL(例如,设置INSERT语句)之后立即提交或回滚事务,你需要在调用setSql()方法时传递一个@Transactional注解。

    以下是一个示例,展示了如何在设置setSql()方法时添加@Transactional注解:

    public class Sql extends JdbcDaoSupport {
    
        @Transactional
        public void executeInsert() {
            // 设置SQL语句
            String sql = "INSERT INTO table_name VALUES (?, ?, ?)";
            sql.executeUpdate();
        }
    }
    

    在这个例子中,executeInsert方法现在会在设置sql属性后自动提交或回滚事务。如果发生错误,事务将被回滚,并且任何更改都将丢失。

    请注意,这只是一个基本的例子。在实际应用中,可能需要根据你的具体需求和环境进行调整。例如,你可能需要指定不同的事务隔离级别或者提供更复杂的事务管理逻辑。

    评论

报告相同问题?