mysql事务

    科技2022-07-31  95

    关于事务

    1、什么是事务

    事务对应的英语单词:Transaction

    事务: 1、一个最小的不可再分的工作单元。 2、通常一个事务对应一个完整的业务(例如:银行账户转账业务,该业务就是一个最小的工作单元)。 3、而一个完整的业务需要批量的DML语句(insert、update,delete)共同联合完成。 4、事务只和DML语句有关系,或者说DML语句才有事务。 5、以上所描述的批量的DML语句有多少DML语句,这个和业务逻辑有关系,业务逻辑不同DML语句的个数也不同。

    2、关于银行账户转账操作,账户转账是一个完整的业务,最小的单元,不可再分,也就是说银行账户转账是一个事务。

    例如:

    t_act 账户表

    actNobalanceact-100150000.00act-100280000.00

    执行转账操作:10000元

    update t_act set balance=40000.00 where actNo='act-1001' update t_act set balance=90000.00 where actNo='act-1002'

    1、以上的两条DML语句要求必须同时成功,或者同时失败,最小单元,不可再分 2、当第一条DML语句执行成功之后,并不能将底层数据库中第一个账户的数据修改,只是将操作记录了一下,这个记录是在内存中完成的,当第二条DML语句执行成功之后,和底层数据库文件中的数据完成同步,若第二条DML语句执行失败,清空所有的历史操作记录,要完成以上的功能,必须供助事务。 3、事务可以保证多个操作原子性,要么全成功,要么全失败,对于数据库中来说,事务保证批量的DML要么全成功,要么全失败

    3、事务四个特征ACID

    原子性(Atomicity):整个事务中的操作,必须作为一个单元全部完成(或全部取消)一致性(Consistency):在事务开始之前与结束之后,数据库都保持一致状态。隔离性(Isolation):一个事务不会影响其它事务的运行。持久性(Durability):在事务完成之后,该事务对数据库所作的更改将持久地保存在数据库中,并不会被回滚。

    4、事务存在一些概念

    事务(Transaction):一批操作(一组DML)开启事务(Start Transaction)结束事务(End Transaction)回滚事务(rollback)提交事务(commit)SET AUTOCOMMIT:禁用或启用事务的自动提交模式。

    5、和事务有关的两务重要SQL语句(TCL)

    commit 提交rollback 回滚

    6、事务开启的标志是什么?事务结束的标志是什么?

    开启的标志:任务一条DML语句(insert,update,delete),标志事务的开启。结束的标志: 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘文件中数据进行一次同步。回滚:失败的结束,将所有的DML语句操作历史记录全部清空。

    7、重点:在事务进行过程中,未结束之前,DML语句是不会更改底层数据库文件中的数据,只是将历史操作记录一下,在内存中完成记录。只有在事务结束的时候,而且是成功的结束的时候才会修改底层硬盘文件中的数据。

    8、在mysql数据库管理系统中,事务的提交和回滚的演示。

    在mysql中,事务默认是自动提交的,也就是说,只要执行一务DML语句,就开启了事务,并且提交了事务

    9、这种自动提交机制是可以关闭的:关闭自动提交的第一种方式

    start transaction; //手动开启事务 DML语句.... DML语句.... DML语句.... DML语句.... DML语句.... commit; //手动提交事务 start transaction; //手动开启事务 DML语句.... DML语句.... DML语句.... DML语句.... DML语句.... rollback; //手动回滚事务

    10、关闭自动提交第二种方式

    1、查看关闭和开启变量的状态

    show variables like '%commit%';

    2、关闭自动提交

    set autocommit=off //或者 set session autocommit=off

    3、打开自动提交

    set autocommit=on //或者 set session autocommit=on

    这种打开和关闭自动提交机制,只对当前会话有效。

    11、事务四个特性之一:隔离性(isolation)

    事务A和事务B之间具有一定的隔离性

    隔离性有四个级别 1、read uncommitted 读未提交;

    事务A和事务B,事务A未提交的数据,事务B可以读取到这里读取到的数据,可以叫做 ‘脏数据’,或者叫做 ‘Dirty Read’这种隔离级别是最低级别,这种级别一般在理论上存在的,数据库默认隔离级别一般都高于该级别的

    2、read committed 读已提交;

    事务A和事务B,事务A提交的数据,事务B才可以读取到这种级别高于上面的读未提交。也就是说,对方事务提交之后的数据,我当前事务才能够读取到,这种隔离级别可以避免脏数据。这种隔离级别会导致:‘不可重复读取’ 3、repeatable read 可重复读;事务A和事务B,事务A提交之后的数据,事务B读取不到事务B是可重复读取数据的这种隔离级别高于读已提交也就是对方提交之后的数据我还是读取不到。这种隔离级别可以达到可重复读取。mysql默认是:可重复读虽然可以达到可重复读的效果,但是会导致:“幻象读” 4、serializable 串行化;事务A和事务B,事务A在操作数据库表中的数据的时候,事务B只能排队等待。这种事务隔离级别一般很少使用,吞吐量太低、用户体验不好这种隔离级别可以避免 “幻象读”,每一次读取的都是数据库中的真实数据事和A和事务B不再并发。

    12、隔离级别与一致性问题的关系

    隔离级别脏读取不可重复读幻象读读未提交可能可能可能读已提交不可能可能可能可重复读不可能不可能对innoDB不可能串行化不可能不可能不可能
    Processed: 0.010, SQL: 8