案例:银行转账:从张无忌账户上给赵敏转1000块。
准备:account(账户表):
---------------------------------------------------------------
id            name(账号,唯一)           balance(余额)
1             张无忌                             20000
2             赵敏                                  0
---------------------------------------------------------------
操作步骤:
           1):检查张无忌的账户余额是否大于等于1000.
           SELECT * FROM account WHERE  name = '张无忌' AND balance >= 1000;
           2):从张无忌的账户余额中减少1000.
           UPDATE account SET balance = balance - 1000 WHERE name = '张无忌';
           3):再在赵敏的账户余额中增加1000.
           UPDATE account SET balance = balance + 1000 WHERE name = ' 赵敏';
如果:在第二步和第三步之间如果程序中断,怎么办? (通过异常来模拟)

代码演示:

public void test1(){String sql = "select * from account where name=? AND balance>?";try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","rootroot");System.out.println(conn);//1.查询张无忌账户余额是否大于1000PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, "张无忌");ps.setDouble(2, 1000.0);ResultSet rs = ps.executeQuery();if(!rs.next()){throw new RuntimeException("账户余额不足");}//2.从张无忌账户中转出1000sql = "update account set balance=balance-? where name=?";ps = conn.prepareStatement(sql);ps.setDouble(1, 1000.0);ps.setString(2, "张无忌");ps.executeUpdate();//---------模拟停电了--------------//int a = 1/0;//--------------------------//3.从赵敏账户中增加1000sql = "update account set balance=balance+? where name=?";ps = conn.prepareStatement(sql);ps.setDouble(1, 1000.0);ps.setString(2, "赵敏");ps.executeUpdate();} catch (ClassNotFoundException |SQLException |RuntimeException ex) {ex.printStackTrace();}}

事务(Transaction,简写为tx):
     在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
     我们把多个密不可分的操作看做是一个整体,那么该整体就称之为一个事务.
--------------------------------------------------
事务的ACID属性:
1. 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态,但是不最终数据不能被破坏,两个账户的总余额是不能改变的.
3. 隔离性(Isolation):MySQL再讲
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
--------------------------------------------------
事务:指构成单个逻辑工作单元的操作集合
事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时, 要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态
处理事务的两个动作:
       提交:commit:   当整个事务中,所有的逻辑单元都正常执行成功.  ---->提交事务.---数据已经提交,不能更改.
       回滚:rollback:  当整个事务中,有一个逻辑单元执行失败,              ---->回滚事务.  
                      撤销该事务中的所有操作,释放锁--->恢复到最初的状态.

1):默认情况下,在JDBC中执行DML操作就会自动提交事务,此时我们得设置事务的手动提交机制(取消事务的自动提交).
    2):查询操作,不涉及数据的更改,所以不需要事务.
    3):MySQL中InnoDB存储引擎支持事务,MyISAM不支持.
     alter table account engine = 'MyISAM';   ---> "InnoDB"
意识:如果是DML操作时,没有异常,代码也正确,但是数据改变不了,首先去想到事务没有提交。

操作事务的模板:

try{//取消事务自动提交:connection对象.setAutoCommit(false);操作1操作2操作3     //提交事务Connection对象.commit();
}catch(Exception e){//处理异常//回滚事务Connection对象.rollback();
}finally{释放资源
}

上述例子修改后代码演示:

@Testpublic void test2() throws ArithmeticException{String sql = "select * from account where name=? AND balance>?";try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","rootroot");//取消事务自动提交conn.setAutoCommit(false);System.out.println(conn);//1.查询张无忌账户余额是否大于1000PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, "张无忌");ps.setDouble(2, 1000.0);ResultSet rs = ps.executeQuery();if(!rs.next()){throw new RuntimeException("账户余额不足");}//2.从张无忌账户中转出1000sql = "update account set balance=balance-? where name=?";ps = conn.prepareStatement(sql);ps.setDouble(1, 1000.0);ps.setString(2, "张无忌");ps.executeUpdate();//---------模拟停电了--------------int a = 1/0;//--------------------------//3.从赵敏账户中增加1000sql = "update account set balance=balance+? where name=?";ps = conn.prepareStatement(sql);ps.setDouble(1, 1000.0);ps.setString(2, "赵敏");ps.executeUpdate();conn.commit();} catch ( Exception ex) {ex.printStackTrace();try {conn.rollback();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

JDBC学习(六、事务处理操作)相关推荐

  1. python 文件操作不被打断_python学习六文件操作和异常处理

    1.文件的定义和类型 什么是文件呢? 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是存储的一种 文件有哪些类型呢? 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件 ...

  2. JDBC学习总结(二)JDBC操作Blob类型字段高效的批量插入JDBC处理数据库事务将多个SQL看成一个事务执行数据库连接池C3P0DBCPDruidDBUtils工具类实现CRUD

    JDBC学习总结(二)JDBC操作Blob类型字段/高效的批量插入/JDBC处理数据库事务/将多个SQL看成一个事务执行/数据库连接池C3P0/DBCP/Druid/DBUtils工具类实现CRUD ...

  3. JDBC学习笔记(六)

    JDBC学习笔记(六) Thinkersky[Email:yanghuangming@rongji.com] 关于婚姻与爱情,一组5至10岁的美国小孩给出了他们的答案.也许听起来傻傻的,但是谁能说小娃 ...

  4. OpenCV与图像处理学习六——图像形态学操作:腐蚀、膨胀、开、闭运算、形态学梯度、顶帽和黑帽

    OpenCV与图像处理学习六--图像形态学操作:腐蚀.膨胀.开.闭运算.形态学梯度.顶帽和黑帽 四.图像形态学操作 4.1 腐蚀和膨胀 4.1.1 图像腐蚀 4.1.2 图像膨胀 4.2 开运算与闭运 ...

  5. JDBC 学习笔记 day02 用 PreparedStatement 实现 CRUD 操作

    JDBC 学习笔记 day02 PreparedStatement 相比于 Statement 的好处 PreparedStatement 实现 增,删,改 操作 PreparedStatement ...

  6. java resultset查询_Java -- JDBC 学习--通过 ResultSet 执行查询操作

    voidtestResultSet(){//获取 id=4 的 customers 数据表的记录, 并打印 Connection conn= null; Statement statement= nu ...

  7. Flash动画学习指引六:操作动作补间

    转自:http://bbs.9ria.com/thread-75053-1-1.html 要求  需求知识  Flash 工作空间基本知识. 用户级别  开始级 需求   •        Flash ...

  8. JDBC编程六步中遇到的问题

    首先,我们介绍一下 JDBC 编程六步 (参考 pink老师) 一. 导入驱动 jar包 导入驱动jar包的两种方式 //方式1 1. 在任务栏创建文件夹(Directory)libs--复制(D:\ ...

  9. 以python入门教程新世界-国外旅行也不忘学习Python:Python 操作列表001

    Python从小白到入门 ~ Part 4 操作列表 001 Python是一门杰出的语言,值得你去学习,咱们现在就开始吧.--<Python编程从入门到实践>P44-P50 人生--这个 ...

  10. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

最新文章

  1. 模式6--ReadWriteLock
  2. Swift:在Safari中打开App
  3. [flutter专题]详解AppBar小部件
  4. 美国支付巨头Verifone遭遇网络攻击
  5. 洛谷P2426 删数
  6. Android之判断手机黑屏以及锁屏
  7. 前端学习(764):创建对象的三种方式
  8. html怎么保存曲奇,自制曲奇饼能保存多久 这些存放方法你懂吗
  9. iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
  10. RFID能否让实体零售业度过“寒冬”?
  11. Python笔记002-列表推导式
  12. VS2019,C#打包发布生成单个exe
  13. ASP.NET学生考勤管理系统【源码分享】
  14. 吴恩达机器学习编程作业
  15. CCNA(思科网络攻城狮) 滴水之力05
  16. Objective-C分类 (catagory)
  17. win10重装系统修改信息
  18. Gamma校正与线性空间
  19. 【模拟电路】431基准电压源
  20. z中国禽肉深加工市场盈利动态与竞争前景分析报告2022-2027年

热门文章

  1. iOS开发--Swift RAC响应式编程初探
  2. SharePoint 2010 BDC Model项目部署出错:“The default web application could not be determined.”...
  3. css基础知识汇总4
  4. nginx基础配置,转发所有
  5. rdbms mysql_不同RDBMS下Join 用法 - MySQL
  6. oracle避免索引失效,Oracle优化你的查询--关于避免索引隐式失效
  7. 一些用CRF做图像语义分割的资源
  8. R-FCN算法及Caffe代码详解
  9. Caffe学习:使用pycaffe绘制网络结构
  10. Python脚本编译为可跨平台、跨架构执行的字节码文件pyc方法