事务

作者: 强某某 | 来源:发表于2018-12-25 11:27 被阅读3次

事务

Transaction 一组操作包含多个单一操作,一组操作必须同事成功或者失败(回滚)

-- 显示是否自动提交(事务)
SHOW VARIABLES LIKE '%commit%'
-- 关闭自动提交
SET autocommit  =off

-- 开启事务
START transaction
-- 回滚和提交
rollback   commit

代码实例

代码的事务,主要是针对连接来的

1. 关闭自动提交
2. 开启事务
3. 提交
4. 异常回滚事务
@Test
    public void testQuery() throws SQLException {
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //jdbc默认事务是自动提交的
             conn = JDBCUtil.getConn();
             //关闭自动提交
             conn.setAutoCommit(false);
             String sql="update student set age=age-? where sex=?";
              ps = conn.prepareStatement(sql);
              ps.setInt(1, 1);
              ps.setInt(2, 31);
              ps.executeUpdate();
              ps.setInt(1, -1);
              ps.setInt(2, 2);
              ps.executeUpdate();
            //提交事务
              conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
            //回滚事务
            conn.rollback();
        }finally {
            JDBCUtil.release(conn, ps, rs);
        }
    }

ACID


  1. 原子性

    事务中包含的逻辑不可分割

  2. 一致性

    事务执行前后,数据完整性保持一致

  3. 隔离性

    事务在执行期间,不应该受到其他事务的影响

  4. 持久性

    事务执行成功,数据应该持久保存到磁盘上


隔离级别


  1. Read Uncommitted 读未提交
  2. Read Commited 读已提交
  3. Repeatable Read 重复读
  4. Senalizable 可串行化(事务排队,先开启事务的执行完毕,其他事务才能有动作)
  • 设置隔离级别

set session transaction isolation level read uncommitted;


安全问题


  1. 读问题 :
    • 脏读(读取的是内存中数据,而不是磁盘中数据,可通过读已提交隔离级别解决该问题)
    • 不可重复读(在隔离级别是读已提交情况下,因为读取是已提交的,所以可能出现前后读取数据不一致,可能上一次读时候还没提交,
      前端两次读取结果不同,这就是不可重复读,可以利用重复度隔离级别避免该问题)
    • 幻读(一个事务读到另一个事务已提交的插入的数据,导致查询结果不一致,通过可串行化解决,但是性能低)
  2. 写问题 : 丢失更新

    解决方案
    * 2.1 悲观锁(一定会丢失更新)
    > 查询时候加上for update


    悲观锁.png

    * 2.2 乐观锁(一定不会丢失更新)
    > 要求程序员自己控制,比如此时手动比较version,如果不符合version,则重新查询


    乐观锁.png

-- 查询隔离级别(mysql默认是重复读)
SELECT @@tx_isolation;

相关文章

  • java事务

    1、java事务介绍 2、JDBC事务 3、JTA事务 1、java事务介绍 java事务分类:JDBC事务、...

  • 事务、MySQL与Python交互、Python 中操作 MyS

    1、事务 事务操作分两种:自动事务(默认)、手动事务 手动事务的操作流程 开启事务:start transacti...

  • 数据库事务书目录

    数据库事务 事务概念 本地事务 全局事务 全局事务的定义 J2EE中全局事务的实现 全局事务的优缺点 基于消息的分...

  • MySQL事务

    MySQL-innodb-事务 事务的特性 事务的生命周期 失败的事务: 事务的控制语句 面试题 事务日志-red...

  • mysql事务隔离机制及其隔离级别、实现原理分析

    目录 事务特性ACID属性 并发事务带来的问题 事务隔离级别 事务实现原理 事务特性ACID属性 事务特性指的就是...

  • MULE事务配置

    在mule的事务可能为jdbc事务,jms事务,xa事务等,多种事务.这里讲解事务的几个动作: 相关的文档:htt...

  • 事务—事务模型

    程序猿基础知识的学习、理解、整理——事务(方方土) 事务,看似很简单,其实很复杂,作为一个程序猿,你对事务到底了解...

  • 事务—XA事务

    程序猿基础知识的学习、理解、整理——事务(方方土) 什么是XA事务?在什么场景下会出现XA事务? @Transac...

  • 事务—事务模式

    程序猿基础知识的学习、理解、整理——事务(方方土) 什么是事务模式?这里提到的事务模式,主要是指在系统设计过程中的...

  • JDK动态代理给Spring事务埋下的坑

    service 模拟动态代理事务 测试类 预测结果模拟事务:开启事务execute doLink模拟事务:关闭事务...

网友评论

    本文标题:事务

    本文链接:https://www.haomeiwen.com/subject/nooxlqtx.html