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


    目录

    事务简介

    事务操作

                  查看/设置事务提交方式

                  提交事务

                  回滚事务 

    事务四大特性(ACID)

    并发事务问题

                   脏读

                   不可重复读

                    幻读

    事务隔离级别


     

    事务简介

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

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

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


    事务操作

    数据准备

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

     转账操作

    1. --转账操作
    2. --1.查询张三账户的余额
    3. select *
    4. from account
    5. where name ='张三';
    6. --2.将张三账户-1000
    7. update account set money = money -1000 where name = '张三';
    8. --3.将李四账户+1000
    9. 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特性,并且具有很好的恢复特性,可以在机器有各种原因崩溃时恢复数据库


    并发事务问题


     脏读

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

     

    不可重复读

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

     
    幻读

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

     


    事务隔离级别

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

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


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

     代码:

    1. --查看事务隔离级别
    2. select @@transaction_isolation;
    3. --设置事务隔离级别
    4. set session transaction isolation level read uncommitted;
    5. set session transaction isolation level repeatable read ;

     (默认隔离级别是 repeatable read )

  • 相关阅读:
    springsecurity学习笔记-未完
    1. Unified Structure Generation for Universal Information Extraction 阅读笔记
    Perl中常见符号与操作
    pthread_cancel引起程序段错误
    Java项目_在线点餐系统(jsp+sevlet+mysql)(含论文)
    利用fiddler正向代理前端请求到本地后端
    探究Linux独立服务器的SSH
    2022云栖现场|体验阿里巴巴工作数字化实践
    个人用户如何保证企业邮箱安全?【网易企业邮箱】
    PGSQL的distinct
  • 原文地址:https://blog.csdn.net/qq_64691289/article/details/127205042