数据库事务

一、事务介绍

  1. 事务:一组逻辑操作单元,使数据从一种状态转换到另一种状态

  2. 一组逻辑操作单元:一个或多个DML操作

  3. 一致性:为保证一致性,数据的操作应当是离散的成组的逻辑单元。全部完成时,一致性保持;这个单元一部分操作失败,整个事务全部视为错误,应从起始点以后的操作全部退到开始状态。

二、事务处理

  1. 事务处理原则:

    ① 保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。

    ② 当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。

  2. 会导致数据自动提交的情况

    ① DDL操作一旦执行,都会自动提交数据

    ② DML默认情况下,一旦执行,就会自动提交数据

    ③ 在关闭连接时,默认会自动提交数据

  3. 解决自动提交问题的方法

    ① 调用Connection对象的setAutoCommit(false);取消自动提交事务

    ​ 在所有的SQL语句都成功执行后,调用commit( )方法提交事务

    ​ 在出现异常时,调用rollback( )方法回滚事务。

    ② 使用数据库连接池技术时,在执行close( ) 方法前,建议恢复自动提交状态setAutoCommit(true)

  4. 考虑事务处理后的通用操作方法
    @Test/** @title transactionCommon* @description 事务处理的通用调用方法* @author e_n* @updateTime 2022/1/26 17:51*/public void transactionCommon() {Connection conn = null;try {// 1.建立连接conn = JdbcUtils.getConnection();// 2.取消了自动提交事务conn.setAutoCommit(false);// 3.执行sql语句// 3.1 sql语句1,并执行String sql1 = "update user_table set balance = balance - 100 where user = ?";update(conn,sql1,"AA");// 模拟网络异常System.out.println(10/0);// 3.2 sql语句2,并执行String sql2 = "update user_table set balance = balance + 100 where user = ?";update(conn,sql2,"BB");// ...可执行多个sql语句// 4.若没有异常,则提交事务conn.commit();} catch (Exception e) {e.printStackTrace();try {// 5.若有异常,则回滚事务conn.rollback();} catch (SQLException throwables) {throwables.printStackTrace();}} finally {try {// 6.恢复每次DML操作的自动提交功能conn.setAutoCommit(true);} catch (SQLException throwables) {throwables.printStackTrace();}// 7.关闭连接JdbcUtils.closeResource(conn,null);}}@Test/** @title update* @description 事务处理的通用增删改方法,要避免调用一次后就关闭conn引发数据库提交,所以需要将conn以参数形式引入* @author e_n* * @updateTime 2022/1/26 17:53*/public void update(Connection conn, String sql, Object...args) {PreparedStatement ps = null;try {ps = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {ps.setObject(i+1,args[i]);}ps.execute();} catch (SQLException throwables) {throwables.printStackTrace();} finally {// 因为conn是以参数形式引入的,所以无法关闭,故在关闭程序中的conn参数为nullJdbcUtils.closeResource(null,ps);}}
    

三、数据库的并发问题

  1. 事务的ACID属性

    原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    一致性(Consistency):指事务必须使数据库从一个一致性状态变换到另一个一致性状态

    隔离性(Isolation):指一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务时隔离的,并发执行的各个事务之间不能互相干扰。

    持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其它操作和数据库故障不应该对其有任何影响。

  2. 数据库的并发问题

    同时运行多个事务,而这些事务又会访问数据库中的相同数据库时,如未对事务采取必要的隔离机制,就会引发下述并发问题

    脏读:对于两个事务T1和T2,T1读取了被T2更新但还没有被提交的字段。(不正常的)

    不可重复读:对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。(认为是合理的)

    幻读:对于两个事务T1和T2,T1读取了一个字段,然后T2在该表中插入了该字段。之后,T1再次读取同一个表,就会多出几行。(认为是合理的)

四、事务隔离级别

  1. 数据库提供的4种事务隔离级别
    隔离级别 描述 默认隔离级别
    READ UNCOMMITTED
    读未提交数据
    允许事务读取未被其它事务提交的变更,
    脏读、不可重复读和幻读的问题都会出现
    READ COMMITED
    读已提交数据
    只允许事务读取已经被其它食物提交的变更,
    可以避免脏读,但不可重复读和幻读仍会出现
    Oracle
    数据库默认
    REPEATABLE READ
    可重复读
    确保事务可以多次从一个字段中读取相同的值,
    在这个事务持续期内,禁止其它事务对这个字段进行更新,
    可避免脏读和不可重复读,但幻读问题仍然存在
    MySQL
    数据库默认
    SERIALIZABLE
    串行化
    确保事务可以多次从一个表中中读取相同的行,
    在这个事务持续期内,
    禁止其它事务对这个表执行插入、更新和删除操作,
    所有并发问题都可以避免,但性能低下
  2. 在MySQL中设置隔离级别

    ① 创建mysql数据库的用户,并授予权限

    // 1. MySQL5.7之前:
    // 1.1 创建mysql数据库的用户
    create user 新建用户名 identified by '新建用户密码';
    // 1.2 给新建用户授予在指定数据库下的所有表的增删改查的权限
    grant select,insert,delete,update on 数据库名.* to 新建用户@localhost identified by '新用户密码';
    // 1.3 给新建用户对于所有库所有表的全部权限
    grant all privileges on *.* to 新建用户名@'%' identified by 'abc123';// 2. MySQL8.0之后:
    // 2.1 创建mysql数据库的用户
    create user 新建用户名@localhost identified by '新建用户密码';
    // 2.2 给新建用户授予在指定数据库下的所有表的增删改查的权限
    grant select,insert,delete,update on 数据库名.* to 新建用户@localhost;
    // 2.3 给新建用户对于所有库所有表的全部权限
    grant all privileges on *.* to 新建用户名@localhost;
    

    ② 查看当前的隔离级别

    // MySQL5.7之前
    select @@tx_isolation;// MySQL8.0之后
    select @@transaction_isolotion;
    

    ③ 设置当前mysql连接的隔离级别

    // MySQL5.7之前
    set transaction isolation level read committed;// MySQL8.0之后
    set session transaction isolation level read committed;
    

    ④ 设置数据库系统的全局的隔离级别

    // 会改变该数据库系统下的所有用户的隔离级别
    set global transaction isolation level read committed;
    

JDBC六:数据库事务相关推荐

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

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

  2. JDBC和数据库事务详解

    现在还在写 JDBC 事务的文章,我觉得我一定是相当的 Out 了,现在主流的 java 应用,框架都是分布式的,各种分布式的事务,或者容器事务才是需要学习的重点,在这里谈 JDBC 确实有点不合时宜 ...

  3. JDBC(数据库和Java)

    JDBC JDBC(Java数据库连接)是一种Java API(应用程序编程接口),允许Java程序与数据库交互.它提供了一个标准接口,用于从Java程序连接到关系数据库(如MySQL.Oracle和 ...

  4. Spring Boot中声明式数据库事务使用与理解

    JDBC的数据库事务 传统JDBC的数据库事务的一个示例如下代码所示,该示例仅为一个insertUser方法的数据库事务过程.可以看到,如果还存在很多其他的数据库事务需要,则需要编写很多类似于如下的代 ...

  5. 使用JDBC进行数据库的事务操作(2)

    本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...

  6. 隔离区别对待?如何捆绑?Java中的jdbc数据库事务及其隔离级别

    文章目录 一.数据库事务简介 二.JDBC事务处理 三.事务的ACID属性 四.数据库的隔离级别 五.设置隔离级别 一.数据库事务简介 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态. 事务 ...

  7. java监听数据库操作_第十六篇——JDBC操作数据库之监听器

    JavaWeb应用中,很多的地方都和session有关.因此session相关的事件监听器,在日常工作中非常有用. 有时候我们需要统计当前在线的人数和访问人数总数,此时就可以使用监听器技术来很简单的实 ...

  8. 六、JDBC操作数据库

    文章目录 JDBC概述 概念 JDBC本质 JDBC好处 JDBC快速入门 JDBC API详解 DriverManager Connection 获取执行SQL的对象 管理事务 Statement ...

  9. 大数据WEB阶段(十八)数据库事务

    数据库事务 一.概述 事务的概念 事务是指逻辑上的一组操作 , 组成这组操作的各个单元 , 要么全部成功 , 要么全部失败 . 如:银行转账.. 转账核心操作其实就是两条sql ,两条都执行成功才算成 ...

最新文章

  1. linux 下/proc/cpuinfo三级缓存,linux /proc/cpuinfo文件分析
  2. python勾股定理_Python学习第128课——在Python中实现醉汉随机游走
  3. ECMAScript 6 入门
  4. QT的QCommandLineOption类的使用
  5. 【Git】处理 Unable to access ‘https://github.com’: OpenSSL SSL_read: Connection was reset, errno 10054
  6. 有了PSD分层模板|花卉海报设计其实很简单!
  7. struts2 action中result参数详解
  8. 测试视频软件支持的格式,支持82种视频格式!电视平台最强的本地播放器!
  9. SmartView函数HypSetActiveConnection使用
  10. 通过js实现页面布局
  11. python 输出\xhh格式的16进制数据(改2)
  12. ESlint 自动格式化代码 补缺代码 添加空格
  13. ARM内核全解析,从ARM7,ARM9到Cortex-A7,A8....Cortex-A53,A57,A72
  14. 【ANDROID 】交叉编译链工具
  15. Python3基本用法 2020.2.20
  16. 2022年怎样的企业才能迎难而上?这场年会给你答案
  17. 恋人间的80个小浪漫
  18. [IC笔试题] FIFO深度计算
  19. 坚果云+svn实现异地非局域网个人代码版本管理
  20. 《如何写好科研论文》《学术规范与论文写作》-长江雨课堂-2022秋季期末考试答案分享

热门文章

  1. 1020 月饼 ——C/C++实现
  2. 展望:2021年值得关注的5大投资方向
  3. ChatGPT: History is temporarily unavailable. We‘re working to restore this feature as soon as possib
  4. 数据库恢复(database restore)之兵不血刃——半小时恢复客户数据库
  5. Pangolin安装及问题
  6. g linux 未定义的引用_G ++ Cpp中的“未定义的引用”
  7. 专访美满科技CEO:用技术和创新让客户服务更简单
  8. Android开发做一个简单的音乐播放器
  9. oracle listagg如何去重
  10. python--inspect模块