jdbc+spring+mysql事务理解和分析

首先了解事务的特性
事务四大特性(简称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事务1-JDBC事务|Spring编程事务 在jdbc编程中,事务是手动提交的,spring接管事务后,整个流程被透明化的东西很多,作为编程人员是应该了解什么被透明化了,不然无法了解事情的本质。 阅读详情

相关推荐

深入理解 Spring 事务原理及69道Spring面试题和答案

一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 1.获取连接 Connection con = DriverManager.getConnection() 2.开启事务con.setAutoCommit(true/false); 3.执行CRUD 4.提交事务/回滚事务 con.commit() / con.rollback(); 5.关闭连接 conn.

m0_67322837的博客 984

Spring中的事务及数据库事务的关系

Spring中的事务及数据库事务的关系 一、MySQL中的事务 如果对MySQL中的事务不了解的话,请先看 基于MySQL 8.0 对事务的深度理解 二、Spring中的事务 Spring管理事务的方式 编程式事务 编程式事务就是利用手动代码编写事务相关的业务逻辑,这种方式比较复杂、啰嗦,但是更加灵活可控制。 声明式事务 其实包括xml配置和注解的使用方式。 xml形如下: &lt...

瘦子没有夏天 8664

基于Spring JDBC的事务处理

基于Spring JDBC的事务处理 事务(Transaction):在数据库中,可以保持一系列的数据操作要么全部执行成功,要么全部执行失败的机制! 假设存在以下信息: 账户 余额 阿三 1000 王五 8000 如果存在任务“王五向阿三转账5000元”,需要执行的SQL语句大致是: update 账户信息表 set 余额=余额-5000 where 账户='王五'; update 账户信息表 set 余额=余额+5000 where 账户='阿三'; 如果出现某种意外,导致以上第

努力是为了站在万人之中,成为别人的光 4856

Spring学习之事物的使用姿势一览

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33801856的博客 153

Unity AR涂涂乐实战:用户上传图片秒变3D模型新皮肤(附完整代码)

本文详细介绍了如何在Unity AR应用中实现用户上传图片动态生成3D模型皮肤的功能,重点讲解了动态创建材质球的技术方案和性能优化策略。通过完整的代码示例,开发者可以学习到多源图片处理、移动端内存管理以及AR场景适配等核心技巧,快速打造高性能的儿童教育类AR应用。

weixin_31509753的博客 370

python自动交易 缠论_缠论自动交易系统实现了

一、缘起:缠中说禅的伟大,我想你只要上网搜索一下就知道了,他的才气不用我说,我只想说说他的《教你炒股票》系列文章,108篇文章,将他的股票操盘秘籍全部公开给广大的股友了,更有缠友将其理论写成公式,在网上也是广为流传,深受广大缠友们的喜爱。我也是缠中说禅的忠实崇拜者之一,从2008年开始每天都使用缠论来看盘,特别想将缠论写成交易系统,让计算加来帮助我们自动交易,从而减轻我们盯盘的辛劳,可是苦于没有好...

weixin_39970689的博客 4637

Mysql事务超时

本文概览:介绍了超时有关的概念:@Transaction的timeout、mybatis的timeout、mysql的innodb_lock_wait_timeout。 1 问题 1.1 背景 在一个事务中完成解析一个大文件,分批存入到数据库。遇到问题,执行时间比较长,就讨论了事务超时的问题,担心执行时间太长,事务超时自动回滚了。 为了考虑这个问题,需要考虑如下超时相关的设置: 一个事务的超时时间。spring的@Transactional 一个stametn的执行时间。包括mybais的tim

I want to know a little more. 8601

基于MATLAB实现的克里金插值的代码

参考代码 克里金插值matlab代码 youwenfan.com/contentcsb/81657.html。

jghhh01的博客 483

Spring入门第九讲——Spring的事务管理

Spring中的事务操作事务的回顾什么是事务事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。事务的特性 原子性:强调事务的不可分割。 一致性:事务的执行的前后数据的完整性保持一致。 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰。 持久性:事务一旦结束,数据就持久化到数据库。 如果不考虑隔离性会引发的安全性问题 脏读:一个事务读到了另一个事务的未提交的数据。

李阿昀的博客 5393

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4457

模型训练篇 | 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程

手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程。本篇文章将带你学习 ResNet50 模型构建、ResNet50训练自己数据集、数据集处理、推理和验证、模型剪枝与模型改进等。 本篇教程适配各种分类识别任务,可以说是一个通用的教程,只需修改自己的数据集即可完成自己领域的任务和系统实现。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 733

Spring 事务理解

Spring 事务到底是什么?Spring 我们十分熟悉,是一个框架,提升我我们的开发效率,我们项目开发使用 Spring 框架,而项目开发往往面临着和数据库交互,如果我们在开发业务功能的时候还要去关心数据库的事务,这样会降低我们的开发效率,Spring 作为这么强大的一个框架,必须要考虑到这个事情,因此 Spring 就有了事务这个说法,简单来说 Spring 事务其实就是数据库事务,只不过把事务的管理过程交给了 Spring 管理,这就是 Spring 事务。欢迎提出建议及对错误的地方指出纠正。

weixin_42118323的博客 1240

9篇1章1节:中国居民健康与营养调查(CHNS)数据库的官网解析和数据下载(2026年版)

在探讨中国社会经济转型与人口健康变迁的学术领域中,中国健康与营养调查(CHNS) 是一个无法绕过的权威数据库。本文将带你深入了解CHNS的项目背景、庞大的数据体系,以及如何通过这两个核心网站获取关键的家庭、个人及社区层面的研究数据。

MD Code 1699

附加:(补):MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spring JDBC:【数据库连接,DataSource数据源,事务控制】的总结和梳理;

说明: (1)为什么写了本篇博客:在【】中,项目整合【声明式事务】时,发现以前接触的MySQL、JDBC、Mybatis、SpringJDBC中的【获取数据库连接、DataSource数据源、事务控制】等内容,比较庞杂和容易混乱,所以想梳理一下; 说明:这儿的理解可能存在错误或偏差,随时修改。 1.MySQL本身; (1)MySQL作为一款成熟和商用的数据库,我们在【(7)MySQL基础】专栏中对其进行了系统性介绍,如有需要可以随时去快速参考; (2)这儿是直接通过SQL语言和My...

小枯林的博客 1086

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

多智能体系统在AI物流优化中的实际应用案例

订单波峰波谷难应对(如双11订单量暴增300%);动态干扰难处理(如突发交通拥堵、客户临时改地址);全局优化难实现(单辆车最优≠整体最优)。本文聚焦“多智能体系统(MAS)”这一AI技术,讲解其如何通过“群体智能”破解物流调度难题,并结合实际案例展示落地效果。本文从“生活故事→核心概念→技术原理→实战案例→未来趋势”逐步展开,用“快递员团队协作送外卖”类比MAS运作,结合Python代码模拟任务分配,最后通过某物流企业的真实项目验证效果。

AIGC应用创新大全的博客 1632

深入理解 Spring 事务原理

一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 1.获取连接 Connection con = DriverManager.getConnection() 2.开启事务con.setAutoCommit(true/false); 3.执行CRUD 4.提交事务/回滚事务 con.commit() / con.rollback(); 5.关闭连接 conn.close(

qq_34156949的博客 5811

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring JDBC与事务管理5:Spring编程式事务;

说明: (1)有关事务内容可以快速参考【MySQL综合应用二:事务机制一:事务的基本介绍】附近文章,【JDBC入门九:JDBC实现事务(十分重要!!!)】; (2)

小枯林的博客 876

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jdbc mysql 事务_MySQL 原生SQL、JDBC、Spring事务使用

MySQL事务通过简单的Sql语句就可以开启提交或回滚事务,实际使用中特别是Spring对事务的封装,可以让我们通过声明或注解的方式就可以控制事务,还可以支持事务的嵌套、传播。为了理解这样的事务设计,还需要从基本的Sql事务控制开始入手。虽然spring提供了更强大更灵活的事务控制方式,不过有些开发者也许更喜欢原生的事务控制方式,因为这用起来清晰明了。也不需要增加对Spring事务设计学习的成本。...

weixin_39797264的博客 99

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Spring Boot】事务和事务传播机制

将一组操作封装成一个执行单元,要么全部成功,要么全部失败。当执行某个操作,例如支付操作时(分为先将钱从个人账户扣除和将他人账户新增两个操作),如果这两个操作不能同时成功或者失败,那么就会出现财产问题。而使用事务就能够很好的解决这个问题。通过上文我们了解到,在需要的方法上添加 @Transactional 注解,就能自动开启事务。接下来将会具体了解下 @Transactional 的使用细节。Spring 事务传播机制定义了多个包含了事务的方法在相互调用时,事务是如何在这些方法之间进行传递的。...

吞吞吐吐大魔王的博客 3854

mysql 事务原生sql_MySQL 原生SQL、JDBC、Spring事务使用

MySQL事务通过简单的Sql语句就可以开启提交或回滚事务,实际使用中特别是Spring对事务的封装,可以让我们通过声明或注解的方式就可以控制事务,还可以支持事务的嵌套、传播。为了理解这样的事务设计,还需要从基本的Sql事务控制开始入手。虽然spring提供了更强大更灵活的事务控制方式,不过有些开发者也许更喜欢原生的事务控制方式,因为这用起来清晰明了。也不需要增加对Spring事务设计学习的成本。...

weixin_35922490的博客 354

spring事务与mysql事务关系_Spring事务与数据库事务的交互原理

Spring事务和数据库事务到底是什么关系?Spring事务是如何传递到数据库的?首先,我们来回忆一下jdbc这个api,这是java操作数据库的入口,是java操作数据库的通道,是我们与数据库打交道的必经之路。那么,是不是说,Spring的事务控制就是通过jdbc传递到数据库,然后执行的呢?我个人觉得,就是这样,并且也只有这样。继续回忆,jdbc怎么操作数据库呢?首先建立连接,然后执行增删改查,...

weixin_33216825的博客 2199

spring事务的理解

一、事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 1.获取连接 Connection con = DriverManager.getConnection() 2.开启事务con.setAutoCommit(true/false); 3.执行CRUD 4.提交事务/回滚事务 con.commit() / con.rollback(); 5.关闭连接 conn.clos

qq_38621978的博客 591

Spring 与事务

即便是在支持事务的数据库中,它们实现事务的方式也各不相同,MySQL 提供对事务的支持,接下来看看在 MySQL 中要如何使用事务。可以看到 jdbc 中对数据库事务的操作都是非常简单的,Spring 与 jdbc 实现事务的操作并无太大差别,只是他把这些封装的太好,会让你觉得是魔法,难以理解。对应的 SQL 语句如下。的方法或者类,使用 AOP 的方式,帮你生成数据库的链接,事务开启、提交、回滚代码,仅此而已。注解之前,还是要先简单介绍下 AOP 在事务上的实现,这对你理解后面的问题,大有裨益。

weixin_44958986的博客 970

Spring事务的理解

一、什么是事务: 我理解为:事务其实就是一件事情,要做就做完,中途出问题了就要恢复成原状态(等于没有做). 二、事务的四大特性 (1)、原子性: 事务必须是一个不可分割的整体 (2)、一致性: 执行完数据库操作后,数据不会被破坏。打个比方,如果从 A 账户转账到 B 账户,不可能因为 A 账户扣了钱,而 B 账户没有加钱吧 (3)、隔离性: 对同一条数据的操作,不同的事务之间应该隔离,要不...

zhangCheng的博客 1197

附加:Spring Boot项目,手动控制事务;(包括:总结了到目前为止,事务的所有内容;)

说明: (1)为什么写本篇博客?:在【Spring Boot电商项目53:订单模块二:【前台:创建订单】接口;】中,我们需要在SpringBoot项目中,去手动控制事务;为此,我们从头总结了事务的内容; (2)声明: ●本篇博客可能存在理解不准确,甚至是理解错误的地方;但目前,其能够帮助自己勉强形成自洽; ●本篇博客的内容,其实挺简单的; 目录 一:有关MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spri...

小枯林的博客 4096
上一篇: Hibernate count如何映射?HQL别名字段问题?
下一篇: Dreamweaver网页制作与色彩搭配全攻略学习笔记
全新时代
博客等级 码龄19年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值