MySQL 使用事务保证数据完整性

学习目标:

  • 掌握MySQL的事务处理方法
  • 理解MySQL的ACID原则
  • 了解MySQL事务处理的应用场景

初识事务

定义:事务就是将一组SQL语句放在同一批次内去执行

特点:如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行

注意MySQL事务处理只支持InnoDBBerkeley DB数据表类型

事务的ACID原则

  • 原子性(A):执行事务时,要么都成功,要么都不成功
  • 一致性(C):执行后,保持数据的一致
  • 隔离性(I):事务之间相互独立,互不影响
  • 持久性(D):执行后,数据永久存储在数据库中

事务隔离级别

  1. read-uncommitted:读取未提交的数据:脏读
  2. read-committed:读取已经提交过的数据:可以避免脏读
  3. repeatable-read:重复读取:可以避免脏读 和 不可重复读 ---mysql默认的
  4. serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表

脏读:当一个事务在执行操作时未提交,另一个事务查看事务时将刚才未提交的事务查询到

幻读:读取到数据,因某一事务的原因,导致刚才的数据消失

查事务隔离级别的方法:

方式一:
mysql> select @@tx_isolation;
方式二:
mysql> select @@global.tx_isolation;
方式三:适合版本较高
mysql> select @@[session/global].transaction_isolation;

session:代表当前会话   global:代表全局   默认session

先查看自己的MySQL版本,我的是MySQL 8.0,查看默认隔离级别:

mysql> select @@session.transaction_isolation;

MySQL 使用事务保证数据完整性_第1张图片

设置事务隔离级别 

mysql>set session transaction isolation level 设置事务隔离级别
  •  设置当前会话默认事务隔离级别为read uncommitted级别:
mysql> set session transaction isolation level read uncommitted;
  • 设置全局会话默认事务隔离级别为read uncommitted级别:
mysql> set global transaction isolation level read uncommitted;

 查看设置结果:

mysql> select @@session.transaction_isolation;

 

MySQL 使用事务保证数据完整性_第2张图片

设置MySQL自动提交

SET AUTOCOMMIT

使用SET语句来改变自动提交模式

SET AUTOCOMMIT = 0;   #关闭自动提交模式
SET AUTOCOMMIT = 1;   #开启自动提交模式

注意

  • MySQL中默认是自动提交
  • 使用事务时应先关闭自动提交

查看默认事务提交方式

mysql> select @@autocommit;

MySQL 使用事务保证数据完整性_第3张图片

关闭自动提交事务

mysql> set autocommit =0;

键入CMD,同时打开两个命令提示符窗口。第一个窗口:首先查看事务提交方式,发现是自动提交(1);然后在第二个窗口关闭自动提交,再查询事务提交方式,发现只关闭了当前会话的提交模式,第一个窗口还是自动提交。截图如下:

MySQL 使用事务保证数据完整性_第4张图片

事务的实现方式

START TRANSACTION   开始一个事务,标记事务的起始点

COMMIT  提交一个事务给数据库

ROLLBACK   将事务回滚,数据回到本次事务的初始状态

SET AUTOCOMMIT =1;  还原MySQL数据库的自动提交

事务实现流程

(1)关闭自动提交:

mysql>set autocommit=0;

(2)开始事务

mysql>start transaction;  或者begine;

(3)执行一系列SQL

mysql>删除、更新等

(4.1)假设出异常  事务回滚

mysql>rollback;

(4.2)假设一切正常  提交事务

mysql>commit;

(5)还原MySQL数据库的自动提交

mysql>set autocommit =1; 

事务案例

顾客A在线购买一款商品,价格为500.00元,假如顾客A银行卡上的余额为2000.00元,且向卖家B支付购买商品费用500.00元,起始卖家B的账号金额10000.00元。

创建数据库shop和创建表account并插入两条数据

用到的命令:

mysql> create database shop;

mysql> use shop;

mysql> create table account(
    -> id int not null primary key auto_increment,
    -> name varchar(32) not null,
    -> cash decimal(9,2) not null);

mysql> insert into account(name,cash) values('A',2000.00);

mysql> insert into account(name,cash) values('B',10000.00);

截图:

MySQL 使用事务保证数据完整性_第5张图片

设置场景

A账户成功减少500元,B账户应该增加500元,但一些错误导致未增加成功,这时需要返回A账户的500元,达到账户总额的平衡。

mysql> begin;

mysql> select * from account;

mysql> update account set cash =cash - 500 where id =1;

以下语句模拟错误
mysql> update account set cash = cashh + 500 where id =2;

mysql> rollback;

截图:

开始事务,查询账户

MySQL 使用事务保证数据完整性_第6张图片

A账户成功减少500元

B账户出错未增加500元

MySQL 使用事务保证数据完整性_第7张图片

事务回滚,将钱退还给A账户

MySQL 使用事务保证数据完整性_第8张图片

你可能感兴趣的:(数据库)