欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MYSQL-事务知识点

程序员文章站 2022-07-15 10:02:54
...

事务是什么

事务是一个完整的业务逻辑单元,不可再分。

例如:银行转账,A–>B转账10000,需要执行两条update语句。

UPDATE t_act SET balance = balance - 10000 WHERE actno = 'act-001'
UPDATE t_act SET balance = balance + 10000 WHERE actno = 'act-002'

以上的DML语句必须同时成功,或者同时失败,不允许单条成功或者单条失败。

为了保证以上语句同时成功或者同时失败,就需要使用数据库的事务机制。

与事务相关的只有DML语句(insert delete update)

这三个语句都会直接操作数据库表中的“数据”.
事务的存在是未了保证数据的完整性、安全性。

如果单条DML可以完成业务,不需要事务机制。

但是显示业务中,通常有多步操作完成,所以需要事务。

事务的特性

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

C:一致性:事务必须保证多条DML语句同时成功或者同时失败。

I:隔离性:事务A与事务B之间具有隔离。

D:持久性:最终数据必须持久化到硬盘文件中,事务才算成功。

关于事务之间的隔离性

事务隔离性存在隔离级别:4层

  1. 读未提交(read uncommitted)
    对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
    读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
  2. 读已提交数据(read committed)
    对方事务提交之后的数据我方可以读取到。
    读以提交存在的问题是:不可重复读。
  3. 可重复读(repeatable read)
    这种隔离级别解决了:不可重复读问题。
    这种隔离级别存在的问题是:读取到的数据是幻象
  4. 序列化读/串行化读
    解决了所有问题。
    效率低需要事务排队。

演示事务

Mysql事务默认情况下是自动提交。
只要执行任意一条DML语句则提交一次。
关闭自动提交start transaction;

DROP TABLE IF EXISTS t_user;
CREATE TABLE  t_user(
id int PRIMARY KEY auto_increment,
username VARCHAR(255)
);

INSERT INTO t_user(username) values ("zhangsan");
-- 事务开始
start transaction;
-- 回滚 (回滚到事务开始前)
rollback;
-- 提交 (该事务完成)
commit;

演示

-- 查看事务隔离级别
    mysql> SELECT @@global.tx_isolation;
    +-----------------------+
    | @@global.tx_isolation |
    +-----------------------+
    | REPEATABLE-READ       |
    +-----------------------+
    1 row in set (0.00 sec)
-- 设置成read uncommitted
    set global transaction isolation level read uncommitted;

相关标签: 存储