左右mysql事务提交
package com.itheima.trans; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.itheima.util.DBUtil; public class TransDemo { /*
创建mysql数据库相关sql语句:
create database day11;
use day11;
create table account(
id int primary key auto_increment,
name varchar(20),
salary double
);
insert into account values(null, 'a', 1000);
insert into account values(null, 'b', 1000);
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtil.getConn();
conn.setAutoCommit(false);//设置自己主动事务提交为false
//a给b转账-----a账户减去100块钱;b账户添加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=?");
ps.setString(1, "a");
ps.executeUpdate(); int i = 1 / 0; //设置异常 ps = conn.prepareStatement("update account set salary=salary+100 where name=? ");
ps.setString(1, "b");
ps.executeUpdate(); conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DBUtil.close(conn, ps, rs);
}
}
}
代码解析:
默认情况下每运行一条sql语句。就是运行一次事务,也就是每一条sql语句的运行都会是一次事务的提交。
在这个样例中假设a给b转账,a账户减去100的sql语句运行成功,这时伴随着一次的事务提交。数据库中的a账户金额减去100。而再运行b的账务添加100sql语句之前。出现了异常,这里我设了一个除以零异常,此时程序终止。bsql语句不再运行。
a账户扣了100,而b账户则金额不变。这时数据出错。
解决方法是:通过conn.setAutoCommit(false);方法设置事务自己主动提交为false。这时每一次的sql语句运行完毕后就不会提交事务,数据库中的数据并不会发生改变,当俩个sql都运行完毕,然后调用coon.commit();方法提交事务,此时数据库中的数据才会真正的改变。假设中途发生异常。通过conn.rollback();方法回滚,此时之前运行的sql语句的结果并不会提交。这样数据就不会出错了。
设置Savepoint:
package com.itheima.trans; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint; import com.itheima.util.DBUtil; public class TransDemo { /*
创建mysql数据库相关sql语句:
create database day11;
use day11;
create table account(
id int primary key auto_increment,
name varchar(20),
salary double
);
insert into account values(null, 'a', 1000);
insert into account values(null, 'b', 1000);
*/
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Savepoint point = null;
try {
conn = DBUtil.getConn();
conn.setAutoCommit(false);//设置自己主动事务提交为false //a给b转账-----a账户减去100块钱。b账户添加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=?");
ps.setString(1, "a");
ps.executeUpdate(); ps = conn.prepareStatement("update account set salary=salary+100 where name=?");
ps.setString(1, "b");
ps.executeUpdate(); point = conn.setSavepoint();
int i = 1 / 0; //a给b转账-----a账户减去100块钱;b账户添加100块钱
ps = conn.prepareStatement("update account set salary=salary-100 where name=? ");
ps.setString(1, "a");
ps.executeUpdate(); ps = conn.prepareStatement("update account set salary=salary+100 where name=? ");
ps.setString(1, "b");
ps.executeUpdate(); conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
if(point == null) {
conn.rollback();
} else {
conn.rollback(point);
conn.commit();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
DBUtil.close(conn, ps, rs);
}
}
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
左右mysql事务提交的更多相关文章
- MySQL事务提交过程(二)
上一篇文章我们介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlog,是因为开启binlog后事务提交流程会变成两阶段提交,这里的两阶段提交并不涉及分布式事务,当然mysql把它 ...
- MySQL事务提交过程
一.MySQL事务提交过程(一) MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提交过程. 由于mysql插件式存储架构,导致开启binlog后,事务提交实 ...
- MySQL 事务提交 --不良好的事务习惯。
MySQL 事务提交 --不良好的事务习惯 我们知道"事务"是数据库区别于文件系统的重要特性之一.MySQL的InnoDB引擎中的事务也完全符合ACID(原子性 一致性 隔离性 持 ...
- mysql 事务提交过程
打开binlog选项后,执行事务提交命令时,就会进入两阶段提交模式.两阶段提交分为prepare阶段和commit两个阶段.流程如下 :这里面涉及到两个重要的参数:innodb_flush_log_ ...
- MySQL事务提交过程(一)
MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提交过程. MySQL体系结构 由于mysql插件式存储架构,导致开启binlog后,事务提交实质是二阶段提交 ...
- MySQL事务提交过程(转载)
http://blog.csdn.net/sofia1217/article/details/53968214 上一篇文章我们介绍了在关闭binlog的情况下,事务提交的大概流程.之所以关闭binlo ...
- 对mysql事务提交、回滚的错误理解
一.起因 begin或者START TRANSACTION开始一个事务 rollback事务回滚 commit 事务确认 人们对事务的解释如下:事务由作为一个单独单元的一个或多个SQL语句组成,如果其 ...
- mysql事务提交和回滚机制
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码: 2 连接数据库,验证密码: 3 验证成功,获得用户信息,比如存款余额等: 4 用 ...
- MySQL事务提交流程详解
MySQL事务的提交采用两阶段提交协议, 前些日子和同事聊的时候发现对提交的细节还是有些模糊,这里对照MySQL源码详细记录一下,版本是MySQL5.7.36. 一. 事务的提交流程. 1. 获取 M ...
随机推荐
- adb 命令使用的时候出现Error
在使用adb 命令行的时候会出现Error 重启adb server 即可,使用管理员运行Cmd 命令窗口 adb kill-server adb start-server 如果是连接真机查看的时候再 ...
- 逻辑与(&&、&)和逻辑或(||、|)
这四个逻辑运算符,大家都知道,但是有时候会凌乱,这里用程序来解释一下,以免忘了.(根据大家反应说:这文章没有解释清楚它们的区别.用法,其实文章主要说的是,如果将这四个运算符用于条件判断,那么它们会是什 ...
- SilkTest Q&A 7
Q61.有一个用Dotnet开发的应用,有1000个为测它而录制的case,一直都运行的很正常,直到有一天… 有人改变了该应用命名空间,由于现在有一个新的window或是panel出现,所以测试脚本一 ...
- Swift - 触摸事件(点击,移动,抬起等)说明及用例
在iOS开发中,UIGestureRecognizer可以方便的响应处理手势事件. 而如果要想更精细的处理,我们还需要借助touchesBegan,touchesMoved,touchesEnded等 ...
- Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
原文:Lucene.Net 2.3.1开发介绍 -- 四.搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了. 代码 4.3.4.1 Analyzer anal ...
- Oracle PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR
抛出异常 Oracle有三种类型的异常错误: 1. 预定义(Predefined)异常 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. ...
- 强算KMeans聚类算法演示器
这些天做C#实验以及这个KMeans算法演示器,学了一下openGL,感觉有待加强. //Point.h /* Point 结构体定义及实现 结构体重载了2个运算符: 1.== //推断两个Point ...
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...
- 浅析Delphi Container库(有开源的DCLX)
与Java和C++相比,Delphi对容器的支持实在少得可怜.Java有强大的集合框架,C++更有STL,Delphi有什么呢,不就是TList几个小巧的列表类,而TCollection系列的类更多只 ...
- 给工程师的 10 条哲理(浅薄者迷信运气,强者相信因果,软件复制成本为零,文凭不重要,AWS使得创业成本为零,每个手机都是口袋里的强大电脑)
无论是主题分布式数据库,微服务,Soylent,尤伯杯,或者矮人要塞,我们试图从物质分离出来炒作,推迟叙事的客人.与尊重有软件工程日报的社论部分客观性. 一位渠道的成员说,“当软件工程每日的意见公布, ...