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. JavaScript刷新页面n种方法

    window.location.href 属性 window.location.href=window.location.href;//刷新当前页面 asp.net 或 asp 利用此功能刷新页面 R ...

  2. delphi xe4 ini文件不能读取的解决方法

    今天发现用inifiles下 tinifile.readstring方法突然不能读数据了,结果把ini文件格式由utf-8改成unicode后就能正常读取了.

  3. ServiceStack.Redis订阅发布服务的调用

    1.Redis订阅发布介绍 Redis订阅发布是一种消息通信模式:发布者(publisher)发送消息,订阅者(Subscriber)接受消息.类似于设计模式中的观察者模式. 发布者和订阅者之间使用频 ...

  4. ABAP 客户报表

    *&---------------------------------------------------------------------* *& Report  ZSDR014 ...

  5. HTML登录注册界面怎么制作?

    在没有学习CSS样式的前提下,是如何做一个简单的注册界面的. 一.表单标签(form) 首先我们先写一个<form></form>的标签,form标签属于表单标签,通常我们的登 ...

  6. Client病毒已感染超7万人 暗扣费并频弹广告

    恶意木马病毒横行,您的钱包还hold得住吗?猎豹移动安全实验室与安天AVL移动安全团队于2015年下半年,共同截获一款名为Client的木马病毒,并且对该病毒进行持续监测.通过进一步关注,我们发现该病 ...

  7. 注解:【无连接表的】Hibernate双向1->N关联

    Person与Address关联:双向1->N,[无连接表的],推荐使用 #由N端控制关联关系 #对于指定了mappedBy属性的@OneToMany,@ManyToMany,@OneToOne ...

  8. 初识ZooKeeper

    最近在看Apache下的一个开源项目ZooKeeper(http://zookeeper.apache.org/doc/trunk/),用百度百科介绍的来说,Zookeeper是一个针对大型分布式系统 ...

  9. pyqt5 开发环境

    pyqt5 pycharm mac下开发环境 brew install python3 安装python3 brew install pyqt5 配置pycharm http://blog.csdn. ...

  10. 配置Tomcat使用https协议

    一.  创建tomcat证书 这里使用JDK自带的keytool工具来生成证书: 1. 在jdk的安装目录\bin\keytool.exe下打开keytool.exe 2. 在命令行中输入以下命令: ...