MYSQL-事务知识点

事务是什么

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

例如:银行转账,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;

发布了5 篇原创文章 · 获赞 3 · 访问量 162

猜你喜欢

转载自blog.csdn.net/sinat_41883676/article/details/104240493
今日推荐