web15_transaction

概述

  • 事务:指逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败。
  • 事务作用:就是保证在一个事务中的多个操作全都成功,或者全都失败。

mysql 的事务

事务操作

sql 描述
start transaction 开启事务
commit 提交事务
rollback 回滚事务

环境准备

代码演示

mysql 中有两种方式来管理事务

  • 自动提交
    mysql 默认使用自动提交的方式来管理事务,即执行一条sql语句提交一次事务
    扩展:Oracle 默认不自动提交事务
  • 手动提交
    将mysql的全局变量autocommit设置为0
    -- 查询autocommit
    SHOW VARIABLES LIKE '%autocommit%';
    
    -- 关闭自动提交. 0:OFF 1:ON
    SET AUTOCOMMIT = 0;
    
    -- 演示
    START TRANSACTION ;
    UPDATE accout set money = 999 where name = 'aa';
    COMMIT ;
    -- ROLLBACK ;
    

JDBC的事务

事务对象

Connection 对象的API 描述
conn.setAutoCommit(false) 开启事务
conn.commit() 开启事务
conn.rollback() 回滚事务

事务处理

  • 通过c3p0连接池获取连接
  • 通过dbutils来处理sql

ThreadLocal

ThreadLocal可以实现在一个线程中的数据共享。

事务特性

  • 原子性(Atomicity):是指事务是一个不可分割的工作单位,事务中的操作要么全部完成,要么全部失败。
  • 一致性(Consistency):是指事务前后数据的完整性必须保持一致。
  • 隔离性(Isolation):是指多个用户并发访问数据库的时候,多个并发事务之间的数据相互隔离。
  • 持久性(Durability):是指一个事务如果被提交,那它对数据库中数据的改变是持久性的。

并发访问的问题

如果不考虑隔离性,事务存在3个并发访问的问题

  • 脏读:一个事务读取到另一个事务未提交的数据。
  • 不可重复读:一个事务读取到另一个事务另一个事务已经提交(update)的数据,造成在一个事务中多次查询结果不一致。
  • 虚读/幻读:一个事务读取到另一个事务另一个事务已经提交(insert)的数据,造成在一个事务中多次查询结果不一致。

隔离级别

数据库设置了4种隔离级别,用来描述两个事务并发的所有情况

  • read uncommitted
    存在三个问题:脏读、不可重复读、虚读
    解决零个

  • read committed
    存在两个问题:不可重复读、虚读
    解决一个:脏读

  • repeatable read
    存在一个问题:虚读
    解决两个问题:脏读、不可重复读

  • serializable
    存在零个问题
    解决三个问题:脏读、不可重复读、虚读

  • Oralce 默认隔离级别:read committed; Mysql 默认隔离级别:repeatable read

  • 安全:read uncommitted < read committed < repeatable read < serializable

  • 性能:read uncommitted > read committed > repeatable read > serializable

发布了26 篇原创文章 · 获赞 1 · 访问量 589

猜你喜欢

转载自blog.csdn.net/laonxs/article/details/104455998