事务处理-回滚(转账操作)(转自http://www.cnblogs.com/void-m/p/6143540.html)
JDBC事务处理-四大原则
原子性
一致性
隔离性
持久性
第一步:实现转账操作

假设在账户中,盖伦有余额5000元,赵信有余额2000元,
盖伦要向赵信转账1000元。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void outMoney(Connection conn,String name,int account) throws SQLException{ String sql="update t_account set balance=balance-? where name=?"; PreparedStatement pst=conn.prepareStatement(sql); pst.setInt(1, account); pst.setString(2, name); int result=pst.executeUpdate(); pst.close();}public static void inMoney(Connection conn,String name,int account) throws SQLException{ String sql="update t_account set balance=balance+? where name=?"; PreparedStatement pst=conn.prepareStatement(sql); pst.setInt(1, account); pst.setString(2, name); int result=pst.executeUpdate(); pst.close();} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
System.out.println("盖伦正在给赵信转账1000元");//转账操作try { outMoney(conn,"盖伦",1000); inMoney(conn,"赵信",1000);} catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace();}finally{ try { System.out.println("转账成功!"); conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }} |
运行:


正常转账成功。
假设 public static void inMoney(Connection conn,String name,int account)运行时出现意外。
人为构造意外

然后运行程序

查看数据库的数据

盖伦少了1000元,赵信余额没有变!
这样,赵信就坑了!!!
【改进】
所需要的函数
con.setAutoCommit(false); // 取消自动提交
con.rollback(); // 回滚
con.commit(); // 提交事务
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
Connection conn=null;try { conn = dbUtil.getConnection(); System.out.println("盖伦正在给赵信转账1000元"); conn.setAutoCommit(false);//取消自动提交 outMoney(conn,"盖伦",1000); inMoney(conn,"赵信",1000);} catch (ClassNotFoundException e) { e.printStackTrace();} catch (SQLException e) { try { conn.rollback();//回滚 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace();}finally{ try { conn.commit();//提交 conn.close(); } catch (SQLException e) { e.printStackTrace(); }} |
事务处理-回滚(转账操作)(转自http://www.cnblogs.com/void-m/p/6143540.html)的更多相关文章
- SQL Server:在事务中回滚TRUNCATE操作
我们一般都认为TRUNCATE是一种不可回滚的操作,它会删除表中的所有数据以及重置Identity列. 如果你在事务中进行TRUNCATE操作,就能回滚.反之,它就不会从日志文件文件恢复数据.它不会在 ...
- Git回滚merge操作
执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...
- 解析php mysql 事务处理回滚操作
论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢 ...
- 解析php mysql 事务处理回滚操作(附实例)
其实用PHP来处理mysql的事务回滚并不难,下面小编就详细的为大家介绍一下.相信大家看完之后都知道如何使用 很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果 ...
- git push 错误,回滚 push操作
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 0.记一次使用git push后,覆盖了同事代码的糗事 前言: 都在WebStorm中操作,Idea或者PyCharm同理 为了高度还原尴尬 ...
- binlog2sql 回滚误操作
参考过在资料: https://github.com/wuyongshenghub/mysqlbinlog2sql https://www.cnblogs.com/xuanzhi201111/p/66 ...
- MySQL【Update误操作】回滚(转)
前言: 继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...
- Spring中@Transactional事务回滚实例及源码
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
随机推荐
- Dynamic range compression
这段时间终于把手头的东西都搞完了,还剩下一个AEC这个模块,这个模块跟整个系统机制有很大关系,单独的模块意义不大. 另外,刚写完一个分类器,希望能大幅提升音乐流派分类的准确率. 下周正式开搞AEC,把 ...
- How-to-uninstall-Meteor // install Meteor manually
How-to-uninstall-Meteor : http://www.uninstallapp.com/article/How-to-uninstall-Meteor-.html install ...
- Effective Python2 读书笔记3
Item 22: Prefer Helper Classes Over Bookkeeping with Dictionaries and Tuples For example, say you wa ...
- ng-bind 与ng-model区别
双向绑定,一般来说是这样 <input ng-model="object.xxx"> <span ng-bind="object.xxx"&g ...
- 怎么在myeclipse中导入已经写好的项目
经常我们需要学习别人写好了的源码来提升自己的编码能力,本文将介绍如何从外部导入别人已经写好的项目到我们myeclipse里面.同时也将介绍怎么给导入的工程改名的问题. ...
- html中的a标签(超链接)的使用
a标签即超链接,用于从一张页面链接到另一张页面.其最重要的属性是href属性,它指示链接的目标. 例如: <a href="http://www.baidu.com/"> ...
- 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人
省份 数量 景区名称 我 北京 7 故宫博物院 1 天坛公园 颐和园 1 八达岭-慕田峪长城旅游区 1 明十三陵景区(神路-定陵-长陵-昭陵) 恭王府景区 北京奥林匹克公园(鸟巢-水立方-中国科技馆- ...
- sql Lloader
create table ban_ji(id integer,ban_ji varchar2(25))insert into ban_ji values(1,'1-(1)');insert into ...
- npm-bluebird使用
API 注意 时刻注意return; 使用Promise.promisify简化对test(val, function(err, result){})的处理; 尽量避免使用deferred objec ...
- iOS 自定义的CodeSnippets添加按下tab键切换到指定输入位置
在需要使用tab来选中并输入内容的地方,添加: <#输入待覆盖的内容#>