首先了解事务的特性
事务四大特性(简称ACID)
1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。
3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
4、持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
在Action层(servlet)
依赖注入signService,调用saveSignInfo方法。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
signService.saveSignInfo(username, password,nickname,pic_url,remark);
} catch (RuntimeException e) {
e.printStackTrace();
}
}
-------------------------------
在Service层接口定义
public interface ISignService {
void saveSignInfo(SignBean sign);
}
//实现类,测试事务,方法命名:save开头
public class SignServiceImpl implements ISignService {
//模拟数据库表中id为自增长的主键列,假设第一条添加成功,第二条添加失败,测试事务回滚。
public int saveSignInfo(String username, String password, String nickname, String pic_url, String remark) {
SignBean sign = new SignBean();
sign.setId(25);
sign.setUser_id(6);
sign.setMood("juint测试啦ww");
signDao.saveQq(sign);
System.out.println("333333333333333");
SignBean sign2 = new SignBean();
sign2.setId(24);
sign2.setUser_id(2);
sign2.setMood("juint测试啦qq");
signDao.saveQq(sign2);
System.out.println("44444444444444");
}
}
在Dao层接口定义
public interface ISignDao {
void saveQq(SignBean sign);
}
实现类,继承JdbcDaoSupport 。
public class SignDaoJdbc extends JdbcDaoSupport implements ISignDao {
public void saveQq(SignBean sign) {
String sql = " insert into tbl_sign(id,user_id,mood,save_time) " +
" values("+sign.getId()+","+sign.getUser_id()+",'"+sign.getMood()+"',now()) ";
JdbcTemplate jt=this.getJdbcTemplate();
jt.execute(sql);
}
}
applicationContext.xml配置文件
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>org.gjt.mm.mysql.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/07zxx?useUnicode=true&characterEncoding=utf8</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="txProxyTemplate" abstract="true" autowire="byName"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="signDao" class="com.studio502.control.dao.jdbc.SignDaoJdbc">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="signService" parent="txProxyTemplate">
<property name="target">
<bean class="com.studio502.control.service.impl.SignServiceImpl">
<property name="signDao" ref="signDao" />
</bean>
</property>
</bean>
说明:
1.由于id键重复导致一条添加成功,一条失败.报错信息如下
org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [ insert into tbl_sign(id,user_id,mood,save_time) values(24,2,'juint测试啦qq4444',now()) ]; Duplicate entry '24' for key 1; nested exception is java.sql.SQLException: Duplicate entry '24' for key 1
Caused by: java.sql.SQLException: Duplicate entry '24' for key 1
从而达到测试回滚效果。
2. dao,service不用throws Exception; mysql类型必须为InnoDB才支持事务。
3. --service方法名的问题-- 以save开头就可以了(以PROPAGATION_REQUIRED定义的为准),否则其他的开头方法名报错信息如下:
org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [ insert into tbl_sign(id,user_id,mood,save_time) values(5,4,'juint测试啦qq',now()) ]; SQL state [S1009]; error code [0]; Connection is read-only. Queries leading to data modification are not allowed.; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed.
Caused by: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed.
4. dao,service都不try ... catch 异常,在action层才捕获异常,会逐层往外抛出异常的。
5. dao方法名跟事务没有关系。
分享到:
相关推荐
以上就是使用`Gradle`、`Spring`、`Spring MVC`、`Spring JDBC`和`MySQL`实现单表数据操作的基本步骤。这个过程中,我们利用了Spring Boot的自动配置特性,减少了大量手动配置的工作,同时通过Spring Data JPA简化了...
Spring的IOC允许开发者将对象的创建和管理交给容器,AOP则允许在不修改原有代码的情况下添加新的功能,如日志记录、事务管理。此外,Spring还包含了数据访问、Web、测试等多个模块,能与Struts2无缝集成。 3. **...
本文将深入探讨一个采用Java技术栈构建的考勤及薪酬管理系统,该系统基于Spring MVC、Spring、Hibernate、Bootstrap和MySQL数据库,具有高效、稳定和易用的特点。 首先,Spring MVC作为核心的MVC框架,负责处理前端...
在企业级Java开发中,"Maven + Spring + MyBatis + MySQL + 事务管理"是一个常见的技术栈组合,它们各自扮演着不同的角色,构建出高效、稳定的后端系统。 **Maven** 是一个项目管理和综合工具,它帮助开发者管理...
在本项目中,Spring作为业务层的核心,负责管理对象的生命周期和依赖关系,同时可以实现事务管理、数据访问抽象以及服务层的实现。 3. **Hibernate**:Hibernate是一个流行的Java ORM(对象关系映射)工具,它简化...
在本项目中,Maven 负责集成所有依赖,包括Spring MVC、Mybatis、Jetty和MySQL驱动等。 2. Spring MVC: Spring MVC 是Spring框架的一部分,它是一个基于模型-视图-控制器(Model-View-Controller)设计模式的Web...
标题中的"sshdemo使用的包"指的是一种基于SSH(Struts2、Spring、Hibernate)框架的演示项目,其中还包含了MySQL和Oracle两种数据库的JDBC驱动,这是一套常见的Java Web开发技术栈。让我们详细了解一下这些技术: 1...
在SSM框架中,MySQL通常作为后端数据存储,通过JDBC驱动与Spring和Mybatis交互,执行SQL语句,完成数据的增删改查操作。 综合使用这些技术,开发者可以快速搭建一个完整的Java Web应用,实现业务逻辑、数据访问和...
在IT行业中,Spring Boot、Spring JDBC Template、MySQL和Sharding-J-Subdb是常见的技术组件,它们在构建高效、可扩展的分布式数据库系统中扮演着重要角色。让我们深入了解一下这些技术及其相互之间的协同工作。 ...
在本项目中,Spring将作为服务层和控制层的基石,负责管理bean的生命周期和事务处理。 MyBatis是一个轻量级的持久层框架,它允许开发者通过简单的XML或注解配置将SQL语句与Java代码关联起来。MyBatis消除了几乎所有...
Struts2.5、Spring4.2 和 MySQL JDBC 是三个在企业级Java应用开发中非常重要的框架和技术。这个压缩包文件“struts2.5+spring4.2+mysql_jdbc-Jar包”显然包含了这三个组件的相关库文件,主要用于构建基于Java的Web...
Spring还提供了大量模块,如Spring MVC、Spring JDBC和Spring ORM,其中Spring ORM与Hibernate整合,使得ORM操作更加方便。 Hibernate作为ORM框架,使得Java开发者可以使用面向对象的方式来操作数据库,而无需编写...
在本项目"SSH - SpringMVC4 + Spring4 + Hibernate4 + c3p0 + Mysql.zip"中,开发者使用了SpringMVC4作为表现层,Spring4作为控制层和服务层,Hibernate4作为持久层,c3p0作为数据库连接池,以及MySQL作为数据库。...
【标题】"项目申报系统(Struts2+Spring+Hibernate+Jsp+Mysql5)130223"是一个基于Java技术栈的web应用程序,主要用于处理项目申报流程。这个系统利用了Struts2作为MVC框架,Spring作为依赖注入容器,Hibernate作为...
【标题】"eclipse+maven+springmvc+spring+mybatis案例附带mysql数据库"是一个典型的Java Web开发项目,它涵盖了多个关键的技术栈,包括Eclipse IDE、Maven构建工具、Spring MVC作为MVC框架、Spring核心框架以及...
在这个架构中,Flex4作为客户端的展示层,BlazeDS作为服务器端的数据通信中间件,Java处理业务逻辑和数据访问,而JDBC则用于Java与MySQL数据库之间的数据交互。以下将详细阐述这个技术组合的关键知识点: 1. **Flex...
5. **MYSQL_jdbc**:类似Oracle_jdbc,MySQL JDBC驱动(也称为Connector/J)是用于连接Java应用程序到MySQL数据库的驱动,遵循JDBC规范,提供对MySQL数据库的读写、事务处理等功能。 6. **MD5**:MD5(Message-...
Spring框架则是一个全面的企业级应用开发平台,它不仅包含Spring MVC,还提供了依赖注入(DI)、AOP(面向切面编程)、事务管理、JDBC抽象、缓存、任务调度等多个核心功能。在全注解开发中,我们可以使用@Autowired...
**SpringMVC、MyBatis、Spring 和 MySQL 框架简介** SpringMVC 是 Spring 框架的一部分,主要用于构建 Web 应用程序。它提供了模型-视图-控制器(MVC)架构,帮助开发者将业务逻辑、数据展示和用户交互分离,使代码...