数据库-数据库-MySQL(12)- 事务

时间:2022-10-13 07:52:02

目录

事务简介

事务操作

              查看/设置事务提交方式

              提交事务

              回滚事务 

事务四大特性(ACID)

并发事务问题

               脏读

               不可重复读

                幻读

事务隔离级别


数据库-数据库-MySQL(12)- 事务

 

事务简介

事务 是一组操作的集合 ,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么成功,要么同时失败。

举个例字就像张三向李四转账1000,但是完成这个操作,首先查看张三的余额有没有1000元,然后让张三的余额减少1000元,李四的余额加上1000元,

数据库-数据库-MySQL(12)- 事务

 默认MySQL的事务是默认提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。


事务操作

数据准备

create table  account(
    id int auto_increment primary key  comment '主键ID',
    name varchar(10) comment '姓名',
    money int comment '余额'
) comment '账户表';
insert into  account(id, name, money)  values  (null,'张三',2000),(null,'李四',2000);

数据库-数据库-MySQL(12)- 事务

 转账操作

--转账操作
--1.查询张三账户的余额
select *
from account
where name ='张三';

--2.将张三账户-1000
update  account set money = money -1000 where name = '张三';

--3.将李四账户+1000
update  account set money = money +1000 where name = '李四';

如果在3行上面写一段中午“程序抛出异常”,导致不能使李四的账户+1000元,即处理异常

查看/设置事务提交方式

SELECT @@autocommit;

SET @@autocommit = 0;

@@ autocmmit = 1是自动提交的意思,但是@@autocmmit = 0,是手动提交的意思 

提交事务

COMMIT;

commit 命令用来将事务中的修改保到数据库中,同时结束事务。 

回滚事务 

ROLLBACK;

rollback 命令用来将数据库恢复到事务开始前的状态,即撤销事务所做的一切修改并结束事务 

首先初始的时候 

SELECT @@autocommit;

可以的到的是 @@autocommit = 1; 这个是等于1是自动提交的意思,然后我们通过

set  @@autocommit = 0; 将提交模式改为手动提交,如果执行完更新数据的语句,必须要手动的写一个 commit ,并执行,进行语句的提交

如果执行的语句出现了错误,那么就需要用回滚事务语句 rollback ,不让语句去执行,返回之前的方式


 

事务四大特性(ACID)

原子性:(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性:(Consistency):事务完成时,必须使所有的数据都保持一致状态。

隔离性:(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性:(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

优秀的数据库软件要确保每个事务都有ACID特性,并且具有很好的恢复特性,可以在机器有各种原因崩溃时恢复数据库


并发事务问题

数据库-数据库-MySQL(12)- 事务


 脏读

  开始时,事务A,执行select操作,然后执行update操作,但是没有完成3的操作即没有提交事务,    但是此时事务B的1select操作,查找的数据就是update更新后的数据,这种问题就是脏读

数据库-数据库-MySQL(12)- 事务

 

不可重复读

开始时,执行事务A的1操作,select id= 1,到数据库,然后并发事务B同时更新id= 1 数据,并提交到数据库,此时事务A的3操作,再去进行select 操作,发现前后数据不一样,这个问题就叫不可重复读

数据库-数据库-MySQL(12)- 事务

 
幻读

就是最开始在事务A中进行查找id 为1的数据,发现没有这个数据,然后并发事务B进行insert,插入操作,并提交到数据库,事务A,在进行第二步操作,插入数据,但是插入不了,因为id是主键,id是唯一的,我再进行3步操作,进行select操作,但是并没有发现这些数据,因为我们已经解决了不可重复读得问题,这种插入时提示有数据,但是再次查找时却找不到这中操作叫不可重复读

数据库-数据库-MySQL(12)- 事务

 


事务隔离级别

数据库-数据库-MySQL(12)- 事务

注:√ 代表存在,×代表不存在

 --查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;


--设置事务隔离级别
SET, [SESSION| GLOBAL]  TRANSACTION ISOLATION   LEVEL  {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

 代码:

--查看事务隔离级别
select @@transaction_isolation;

--设置事务隔离级别
set session  transaction isolation level  read uncommitted;

set session  transaction isolation level repeatable read ;

 (默认隔离级别是 repeatable read )