[数据库]事务的介绍

一、事务的概念

一个事务是由一条或者多条操作数据库的SQL语句组成的一个不可分割的单元
只有当事务中的所有操作都正常执行,整个事务才能提交到数据库,要么成功,要么失败,不可能出现部分成功或失败
【举个栗子】:从账户1给账户2转账10元,在转账完成的时候,账户1突然没网了,那此时,账户1的余额已经减少10,账户2的余额没有增加,这时就涉及到事务的问题。

1. 基本概念
  1. 事务是一组SQL语句的执行,要么成功,要么失败,不能出现部分的成功或失败,事务操作具有原子性
  2. 事务的所有SQL全部执行完毕,才可以执行(commit)服务,将数据结果写回磁盘
  3. 在事务执行过程中,只要有SQL出现问题,事务就必须回滚(rollback)到最初的状态
2. 事务的特征: A C I D
  1. A ——原子性 (Atomic)
    事务是一个不可分割的整体,事务必须具有原子特征,即数据操作要么全部执行,要么全部不执行
  2. C ——一致性 (Consistency)
    一个事务执行之前和之后,数据库必须保持一致性状态,一致性状态需要用户保证。 例如:银行转账功能
  3. I ——隔离性 (Isolation)
    当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事务内的操作与其他事务的操作隔离起来,不被其他正在执行的事务看到。
  4. D ——持久性 (Durability)
    事务完成(commit、rollback)之后,会保证数据库中的数据修改是永久性的,即使数据库出现故障,也能保证回复数据
  • 事务隔离使用不当会造成 脏数据 问题

  • 脏读(Dirty Read)
    一个事务读取了另一个事务未提交的数据。
    例如: 事务B读取到事务A未提交的数据↓↓
    当事务A和事务B并发操作时,在事务A更新数据后,事务B读取到A未提交的数据,此时事务A回滚,事务B就读取到了事务A未提交的无效的脏数据。

  • 不可重复读(No Repeatable Read)
    一个事务的操作导致另一个事务前后两次读取到不同的数据
    例如:当事务A和B并发操作时,事务B查询并读取数据之后,事务A实行更新操作,事务B读取的数据,事务B查询数据发现前后两次读取的数据结果不一致。

  • 幻读(phantom Read)
    一个事务的操作导致另一个事务前后两次查询的数据不一样
    例如: 事务B读取了事务A新增 读不到事务A已经删除的数据
    当事务A和B并发操作时,事务B查询读取数据后,事务A新增或者删除一条满足事务B条件的数据,此时数据B再次查询,发现查询到前一次不存在的数据或者前一次查询到的数据不见了。

3.事务涉及到的锁

由于多个线程会请求相同的数据,事务之间通常都会用锁互相隔离,因为数据库支持不同类型的锁,Java JDBC支持不同级别的事务处理,它们由Connection对象指定。
在JDBC中,定义了以下5种事务隔离级别:

  1. TRANSACTION_NONE。 表示不支持事务
  2. TRANSACTION_READ_UNCOMMITTED。未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读”脏”数据,不可重复读和虚读都是被允许的。
  3. TRANSACTION_READ_COMMITTED。已提交读。说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。
  4. TRANSACTION_REPEATABLE_READ。可重复读。说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
  5. TRANSACTION_SERIALIZABLE。可序列化/串行化。是最高的事务级别,它防止读脏数据,不可重复读和虚读。
隔离级别脏读不可重复读幻读
未提交读可以可以可以
已提交读不可以可以可以
可重复读不可以不可以可以
串行化不可以不可以不可以

需注意:事务隔离级别越高,为避免冲突所花费的性能也就越多。
可以通过Connection接口下面的函数来设置事务的隔离级别:

二、MySQL的事务处理

  1. 查看MySQL事务提交事务类型

    mysql> select @@autocommit;
    在这里插入图片描述
    0:表示手动提交事务 1:自动提交事务,默认为自动提交事务

    //设置为手动提交: mysql> set autocommit = 0;
    begin: 开启一个事务
    commit: 提交一个事务
    rollback:回滚事务到初始状态
    savepoint tg:设置一个名称为tg的保存点
    rollback to tg:回滚到tg位置点

  2. 查询数据库隔离级别:

    mysql> select @@transaction_isolation; //新版本
    mysql> select @@tx_isolation;  //旧版本,有时候会报错。
    

    下图显示为可重复读
    在这里插入图片描述

  3. 设置隔离级别

    set global TX_ISOLATION= '   '//单引号内填写隔离级别
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值