为了做这个实验,设计个场景,要把用户2 上账户的22块钱打一块钱到账户1的账上去。要么全成功,全失败,也就是账要做平。

代码如下:

其中最关键的是:

updateMoneyByUserId(1, getMoneyByUserId(1) + 1,false); //这条语句是否回滚

updateMoneyByUserId(2, getMoneyByUserId(2) - 1,true); //设置抛出异常,

当用户2在打钱时抛出异常,没成功时,用户1的更新要回滚回来。在mysql connection中默认是自动提交的,需要设置为手动提交,然后才可用rollback方法进行回滚。

package com.test.transaction;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

/**

CREATE TABLE `usermoney` (

`user_id` int(11) NOT NULL DEFAULT '0',

`moneyNum` int(11) DEFAULT NULL,

PRIMARY KEY (`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='user for money';

INSERT INTO `usermoney` VALUES (1,11),(2,22),(3,33),(4,44),(5,55);

* */

public class TranTest {

static Connection connection;

static {

try {

// 加载驱动程序

Class.forName("com.mysql.jdbc.Driver");

// 连续数据库

connection = DriverManager.getConnection(

"jdbc:mysql://127.0.0.1:3306/banker", "root", "123456");

if (!connection.isClosed()) {

System.out.println("created connetion...:" + connection);

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws InterruptedException {

try {

//手工设置数据库为一个初始状态,并提交

connection.setAutoCommit(false);//默认为自动提交

updateMoneyByUserId(1, 11,false);

updateMoneyByUserId(2, 22,false);

connection.commit();

//查询是否是设置正确1 --11 ; 2 --22

System.out.println("userID=1 & moneyNum=" + getMoneyByUserId(1));

System.out.println("userID=2 & moneyNum=" + getMoneyByUserId(2));

//如果更新是抛异常,需要注意回滚

connection.setAutoCommit(false);

updateMoneyByUserId(1, getMoneyByUserId(1) + 1,false); //这条语句是否回滚

updateMoneyByUserId(2, getMoneyByUserId(2) - 1,true); //设置抛出异常,

//如果抛异常,下面语句不再执行

System.out.println("userID=1 & moneyNum=" + getMoneyByUserId(1));

System.out.println("userID=2 & moneyNum=" + getMoneyByUserId(2));

//如果不抛异常,不提交会怎样?(结束时还是会做一次提交)

connection.commit();

} catch (SQLException e) {

try {

e.printStackTrace();

//开始回滚

connection.rollback();

//数据库是否还是正确的呢?1==11 ; 2==22

System.out.println("check if userId=1 and moneyNum==11-->userID=1 & moneyNum=" + getMoneyByUserId(1));

System.out.println("check if userId=2 and moneyNum==22-->userID=2 & moneyNum=" + getMoneyByUserId(2));

} catch (SQLException e1) {

e.printStackTrace();

}

}

Thread.sleep(10000L);

}

/**

* 通过UserId获取Money number

* */

public static int getMoneyByUserId(int userId) throws SQLException {

// 执行SQL语句

Statement statement = connection.createStatement();

// 要执行的SQL语句

String sql = "select user_id,moneyNum from usermoney where user_id="

+ userId;

statement.execute(sql);

ResultSet rs = statement.executeQuery(sql);

rs.next();

return new Integer(rs.getString("moneyNum"));

}

/**

* 更新用户金额

* */

public static void updateMoneyByUserId(int userId, int moneyNum,boolean showThrow)

throws SQLException {

// 执行SQL语句

if (showThrow) {

throw new SQLException("不让你存");

}

Statement statement = connection.createStatement();

// 要执行的SQL语句

String sql = "update usermoney set moneyNum=" + moneyNum

+ " where user_id=" + userId;

System.out.println(sql);

statement.executeUpdate(sql);

}

}

通过以上代码实验,我们还可以得出一个经验。

在一个方法中同时操作本地数据库和调用远程接口时,要先把本地数据库事务操作完成后,再调用远程接口。

因为如果先调用接口,再操作本地数据库事务是抛出异常,再回滚时,本地数据库就和远程接口数据不一致了。

如果先操作本地数据库,抛出异常还可以自己决定一次是否要调用远程接口。

现在比较大的项目,常用spring来做事务管理,接下来做更多的这方面研究。

mysql数据库技术实验小结_Mysql数据库事务实验以及总结相关推荐

  1. mysql数据库技术教材答案_MYSQL数据库习题解答.pdf

    数据库原理与应用教程―SQLServer2008 习题解答 第 1 章 习题 1.数据库的发展历史分哪几个阶段?各有什么特点? 答:数据库技术经历了人工管理阶段.文件系统阶段和数据库系统三个阶段. 1 ...

  2. linux mysql 实战_Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06

    Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06 视频教程学习地址 Oracle/MySQL数据库学习专用QQ群:336282998.189070296 学完风哥本课程能熟悉 ...

  3. mysql隔离级别加锁情况_MySQL数据库事务各隔离级别加锁情况--read committed amp;amp; MVCC...

    上节回顾 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理解. 这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解. 前言 ...

  4. mysql数据 锁 隔离级别_MySQL数据库事务各隔离级别加锁情况--read uncommitted篇

    1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解. 2.数据库事务的隔离级别只是了解,并没有深刻理解,也没有在实际工作中体验使用过. 3.经常面试被人问起数据库加锁情况,一 ...

  5. mysql数据库实验任务二_MySQL数据库实验:任务二 表数据的插入、修改及删除

    任务二 表数据的插入.修改及删除 @[toc] 班级 姓名 软件工程16-9班 洪燕妮 [实训目的与要求] 1.利用MySQL命令行窗口进行增.删.改数据操作: 2.利用界面工具进行增.删.改数据操作 ...

  6. mysql数据库原理及设计_MySQL数据库原理、设计与应用

    内容简介 本书是面向MySQL数据库初学者推出的一本入门教材,以通俗易懂的语言.丰富实用的案例,详细讲解了MySQL的开发和管理技术. 全书共12章.第1章讲解了数据库基本概念和MySQL的安装步骤: ...

  7. mysql数据库表格怎么建立_mysql数据库表格怎么建立

    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ...

  8. mysql数据库引擎博客_mysql 数据库引擎常识全集

    1.mysql引擎简介: MyISAM引擎是mysql关系数据库管理系统的默认存储引擎(mysql 5.5以前).这种mysql表存贮结构从的旧的ISAM代码扩展出许多有用的功能.在新版本的mysql ...

  9. mysql insert 不需要日志_MySQL数据库性能优化(1)「转」

    1.MySQL概述 从本文开始我们将讨论建立在块存储方案之上的关系型数据库的性能优化方案和集群方案.关系型数据库的选型将以创业公司.互联网行业使用最广泛的MySQL数据为目标,但是MySQL的安装过程 ...

最新文章

  1. 求助贴:人工智能offer,阿里or腾讯,选哪个?
  2. 如何在C ++中使用数组?
  3. vue项目中处理左侧导航栏问题的分享
  4. C++ STL 一般总结
  5. oracle误删数据的解决方法
  6. 诚通网盘会员很坑的,升级会员的人要注意
  7. CANOpen服务数据对象报文
  8. Avast I Love You
  9. git向远程推送代码提示需要token
  10. Quartus17下载程序进FPGA
  11. 深度学习之LSTM完全图解
  12. Filter -- 过滤敏感词汇
  13. 4412 使用小度wifi
  14. 微信小程序宠物论坛2
  15. CAXA实体设计 2020 在草图中怎么快速选择与某一曲线相连的曲线?
  16. maximo工作流画布加载失败问题
  17. PDF如何编辑?教你几个常用的PDF编辑方法
  18. win10使用L2TP连接远程服务器失败的问题
  19. SWFObject2
  20. 计算机一级考excel基础知识,计算机一级考试模拟题(word、excel、以及基础知识).doc...

热门文章

  1. SQLServer之修改FOREIGN KEY约束
  2. Electron 实战桌面计算器应用
  3. 从“共享马扎”的营销,看共享经济的刷屏玩法
  4. android源码分析-深入MessageQueue
  5. 第十三周学习进度情况
  6. 从线上教育的如火如荼,反思传统培训行业的未来发展
  7. Delphi XE5 for Android (十)
  8. Yii 框架调试之CWebLogRoute
  9. BS-XX-007基于JSP实现户籍管理系统
  10. 攻击NLP模型:通用对抗触发器入门