首先了解事务的特性
事务四大特性(简称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方法名跟事务没有关系。
分享到:
相关推荐
两个项目,一个项目是基于spring jdbc实现的分布式事务,一个是基于spring hibernate的分布式事务,hibernate项目里的applicationContext2.xml是基于mysql和mssql, applicationContext3.xml基于两个mssql, ...
事务处理也交由Spring去管理。 压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,...
1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二、 ...
注意:只是jdbc自带的jdbctample,不能 用于整合mybatis框架的事务,我整合了,事务不起作用!!!! 按老师的说法是基于xml方式,但不准确,因为也用到了注解 <aop:aspectj-autoproxy proxy-target-class="true">...
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
Spring2.5+MySQL实现的JDBC操作(包括编程式事务的代码),如果有看不懂的地方可以去本人的博客:http://blog.csdn.net/Acceptedxukai,里面有具体讲解。
这是本人上课过程中为学生讲解hibernate、spring和mysql开发简单项目的截图汇集,大家需要先自己完成数据库以及JDBC数据源的配置,之后按照该截图的顺序就能完成一个最简单的支持数据库事务处理的SH系统,(如果使用...
完整的例子,成功运行. 配好mysql数据库后,可以直接main方法测试事务.
使用MySQL时,如果发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题,到底是什么原因,下面与大家分享下
(1) spring框架中(4.3.3):oap、beans、context、core、expression、tx(事务)、test(测试)、jdbc (2) 日志:commens-logging (4) dbcp数据源:commons-dbcp、commons-pool (5) junit: junit、hamcrest (6) ...
- 实现数据库操作的事务管理 - 添加 AOP 依赖 - 使用 AOP 为所有访问添加日志打印 ### Ver 3.0 - 使用 Spring IoC 管理对象 - 添加 database-mvc module,派生自 database module - web-mvc-context.xml 中添加 ...
struts hibernate dwr 与Spring完全结合,实现用户列表、信息增、删、改、查、维护时用户重名提示等功能,还包括页面自动转码设置(web.xml),Hibernate管理服务按Bean名称拦截并进行Spring事务管理,完全由Spring...
文章目录事务一、事务的基本介绍1、概念2、操作3、操作实例4、MySQL数据库中默认自动提交二、事务的四大特征三、事务的隔离级别1、概念2、存在的问题3、隔离级别四、Jdbc事务控制1、概述2、控制事务的API:3、核心...
增加mybatis多数据源操作,引用seate1.2处理分布式事务,多数据源事务,引用shardingSphere进行分库分表处理 项目布署图 它有什么作用 本框架使用spring cloud为基本架构,结合阿里dubbo + nacos提供服务层 再结合...
介绍分布式事务的定义、原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA、Spring事务同步、链式事务等,并通过实战介绍其实现。除此以外还介绍了一些分布式事务相关的技术,如幂等性、...
分片JDBC是JDBC的扩展,提供了诸如分片,读/写拆分和BASE事务之类的分布式功能。 特征 1.分片 分布式数据库中支持的聚合功能,分组依据,排序依据和限制SQL。 支持联接(内部/外部)查询。 分片运算符= ,支持...
基于分布式事务seata+分库分表shardingspherejdbc+nacos+dubbo项目源码.zip 1. 环境准备 - nacos: `sh ./docker/nacos/startup.sh` - seata-server - 导入配置: `sh ./docker/seata-server/conf/nacos-config.sh ...
Spring IOC 控制反转:把创建对象的权利交给Spring 创建对象 1.无参构造 2.静态工厂 3.实例工厂 管理对象 对象关系DI 构造器注入 set注入 生命周期 scope:prototype/singleton init-...