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)的更多相关文章

  1. SQL Server:在事务中回滚TRUNCATE操作

    我们一般都认为TRUNCATE是一种不可回滚的操作,它会删除表中的所有数据以及重置Identity列. 如果你在事务中进行TRUNCATE操作,就能回滚.反之,它就不会从日志文件文件恢复数据.它不会在 ...

  2. Git回滚merge操作

    执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...

  3. 解析php mysql 事务处理回滚操作

    论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢 ...

  4. 解析php mysql 事务处理回滚操作(附实例)

    其实用PHP来处理mysql的事务回滚并不难,下面小编就详细的为大家介绍一下.相信大家看完之后都知道如何使用 很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果 ...

  5. git push 错误,回滚 push操作

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 0.记一次使用git push后,覆盖了同事代码的糗事 前言: ​ 都在WebStorm中操作,Idea或者PyCharm同理 ​ 为了高度还原尴尬 ...

  6. binlog2sql 回滚误操作

    参考过在资料: https://github.com/wuyongshenghub/mysqlbinlog2sql https://www.cnblogs.com/xuanzhi201111/p/66 ...

  7. MySQL【Update误操作】回滚(转)

    前言:      继上一篇MySQL[Delete误操作]回滚之后,现在介绍下Update回滚,操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和bi ...

  8. Spring中@Transactional事务回滚实例及源码

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

  9. Spring中@Transactional事务回滚(含实例详细讲解,附源码)

    一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...

随机推荐

  1. Dynamic range compression

    这段时间终于把手头的东西都搞完了,还剩下一个AEC这个模块,这个模块跟整个系统机制有很大关系,单独的模块意义不大. 另外,刚写完一个分类器,希望能大幅提升音乐流派分类的准确率. 下周正式开搞AEC,把 ...

  2. How-to-uninstall-Meteor // install Meteor manually

    How-to-uninstall-Meteor :  http://www.uninstallapp.com/article/How-to-uninstall-Meteor-.html install ...

  3. Effective Python2 读书笔记3

    Item 22: Prefer Helper Classes Over Bookkeeping with Dictionaries and Tuples For example, say you wa ...

  4. ng-bind 与ng-model区别

    双向绑定,一般来说是这样 <input ng-model="object.xxx"> <span ng-bind="object.xxx"&g ...

  5. 怎么在myeclipse中导入已经写好的项目

    经常我们需要学习别人写好了的源码来提升自己的编码能力,本文将介绍如何从外部导入别人已经写好的项目到我们myeclipse里面.同时也将介绍怎么给导入的工程改名的问题.                 ...

  6. html中的a标签(超链接)的使用

    a标签即超链接,用于从一张页面链接到另一张页面.其最重要的属性是href属性,它指示链接的目标. 例如: <a href="http://www.baidu.com/"> ...

  7. 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人

    省份 数量 景区名称 我 北京 7 故宫博物院 1 天坛公园 颐和园 1 八达岭-慕田峪长城旅游区 1 明十三陵景区(神路-定陵-长陵-昭陵) 恭王府景区 北京奥林匹克公园(鸟巢-水立方-中国科技馆- ...

  8. sql Lloader

    create table ban_ji(id integer,ban_ji varchar2(25))insert into ban_ji values(1,'1-(1)');insert into ...

  9. npm-bluebird使用

    API 注意 时刻注意return; 使用Promise.promisify简化对test(val, function(err, result){})的处理; 尽量避免使用deferred objec ...

  10. iOS 自定义的CodeSnippets添加按下tab键切换到指定输入位置

    在需要使用tab来选中并输入内容的地方,添加: <#输入待覆盖的内容#>