重新了解数据库——事务

撒子是事务?

事务的意思是一条或者是一组语句组成一个单元,这个单元要么全部执行,要么全不执行

比如我们转账,A要给B转300块钱,我们需要用两条sql语句,A账户的钱减去500,B账户中的钱增加500,但是计算机可能由于某些原因上面语句执行了下面的没有执行,所以为了保证两条语句要么都执行,要么都不执行,这时候就用到了事务。

事务的四个原则(ACID)

原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都成功,要么都失败

一致性(Consistency)

事务前后的数据完整性要保持一致

隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,事物之间要相互隔离。

持久性(Durability)

事务一旦提交则不可逆,被持久化到数据库中

事务实现

--模拟转账
set autocommit = 0;  --关闭自动提交
start transaction;    --开启一组事务

update account set money=money-500 where name='A';  --A的钱-500
update account set money=money+500 where name='B';  --B的钱+500

commit;   --提交事务,就会被持久化
rollback;   --回滚,提交失败就回滚

set autocommit = 1;   --回复默认值

隔离所导致的一些问题

脏读:

一个事务读取了另外一个事务未提交的数据

不可重复读:

原本有单修改了的数据

幻读:

别的事务插入的新数据,导致前后读取不一致

 

隔离级别

1.未提交读(read-uncommitted)

在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。

2.已提交读(read-committed)

在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。

3.可重复读(repetable-read)

MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。

4.可串行化(serializable)

这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。

隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读 最低级别,只保证不读取物理上损坏的数据
已提交读 语句级
可重复读 事务级
可串行化 最高级别,事务级
发布了322 篇原创文章 · 获赞 61 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/wan_ide/article/details/105392962
今日推荐