5 . 事务

1事务概述

>>一个事务其实就是一个完整的业务逻辑。
    是一个最小的工作单元。不可再分。

        假设转账,从A账户向B账户中转账10000.
        将A账户的钱减去10000(update语句)
        将B账户的钱加上10000(update语句)
        这就是一个完整的业务逻辑。

>>说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!(保证数据符合实际,保证数据安全)

2在mysql中

 提交事务    commit;
       清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
       提交事务标志着,事务的结束。并且是一种全部成功的结束。

回滚事务   rollback;
       将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
       回滚事务标志着,事务的结束。并且是一种全部失败的结束。

如果不使用 start transaction ,都是每条DML语句就提交一次

示例:

1.        mysql> select * from dept_bak;
        Empty set (0.00 sec)

2. start transaction;

3. insert into dept_bak values(10,'abc', 'tj');

4. insert into dept_bak values(10,'abc', 'tj');

5. select * from dept_bak;                  //注意,在transaction进行中,前面语句的执行效果是可以被查询到的!!
        +--------+-------+------+
        | DEPTNO | DNAME | LOC  |
        +--------+-------+------+
        |     10 | abc   | tj   |
        |     10 | abc   | tj   |
        +--------+-------+------+

6. rollback;

7. select * from dept_bak;
        Empty set (0.00 sec)

3事务特性

    A:原子性
        说明事务是最小的工作单元。不可再分。

    C:一致性
        所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,
        以保证数据的一致性。

    I:隔离性
        A事务和B事务之间具有一定的隔离。
        教室A和教室B之间有一道墙,这道墙就是隔离性。
        A事务在操作一张表的时候,另一个事务B也操作这张表会那样???

    D:持久性
        事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据
        保存到硬盘上!

4事务隔离种类

①读未提交: read uncommitted(最低的隔离级别)(可以理解为没有隔离

>>事务A可以读取到事务B未提交的数据

>>缺点:脏读现象 (Dirty Read)

>>实例:事务A,B开启——t表空——事务A插入数据1——事务B可以查到数据1

②读已提交: read committed  

>>事务A只能读取到事务B提交之后的数据

>>缺点:不可重复读取数据  (每次select读到的数据会不一样)

>>实例:t表有数据1——事务A,B开启——事务A插入数据2——事务B可以查到数据1,但查不到数据2——事务A提交——事务B可以查到数据1和数据2

③可重复读:repeatable read

>>事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。

>>缺点:幻影读  (虽然每次读到的都是一样的,但是实际上有的数据已经发生改变了

>>实例:相当于事务A开启的那一刻,就对数据拍了一个快照,之后就算事务B提交数据,也不会影响事务A的查询的数据。

④序列化/串行化:serializable(最高的隔离级别)

>>事务排队,不能并发!

>>每一次读取到的数据都是最真实的,并且效率是最低的。

5事务隔离查询修改

5.1查询:

select @@global.transaction_isolation; (全局)

select @@session.transaction_isolation; (会话)

如果选择global,意思是此语句将应用于之后的所有session,而当前已经存在的session不受影响。

如果选择session,意思是此语句将应用于当前session内之后的所有事务。

如果什么都不写,意思是此语句将应用于当前session内的下一个还未开始的事务。

5.2修改:

set global transaction isolation level read uncommitted;

猜你喜欢

转载自blog.csdn.net/weixin_44593786/article/details/121191763
今日推荐