数据库进阶

事务(Transaction)

事务是由一系列对系统中数据访问与更新的操作所组成的⼀个程序执行逻辑单元。

事务的语法

  • start transaction; begin;(之前事务是自动提交,使用该语法(手动提交)开启一个事务,在mysql默认隔离级别下如果在begin后在表中插入数据没有commit,则只是在当前客户端显示,并没有保存到数据库,若用同样的账号密码登录客户端,则无法显示数据的更新)
  • commit; 使当前的修改确认(数据保存到数据库,此时即使新开启同一个客户端也可以看到)
  • rollback; 使得当前的修改被放弃(只有begin和DML,没有commit(事务在未提交之前都是可以回滚的))
begin;
insert into emp values ("Jack",1);
rolllback;/commit;

  

事务的ACID特性

1. 原子性(Atomicity)

事务的原子性是指事务必须是⼀个原子的操作序列单元。事务中包含的各项操作在⼀次执行过程中,只允许出现两种状态之一。

(1)全部执行成功 (2)全部执行失败

事务开始后所有操作,要么全部做完,要么全部不做,没有中间地带。若事务执行过程中出错, 会回滚到事务开始前的状态,所有的操作就像没有发生一样。即事务是⼀个不可分割的整体,就 像化学中学过的原子,是物质构成的基本单位。

2. ⼀致性(Consistency) 事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于⼀致性状态。 比如:如果从A账户转账到B账户,不能出现A账户扣钱,而B账户没有加钱的情况。一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

3. 隔离性(Isolation) 事务的隔离性是指在并发环境中,并发的事务是互相隔离的。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。 ⼀个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。 隔离性分为4个级别。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修 改它之后的状态,事务不会查看中间状态的数据。

4. 持久性(Duration) 事务的持久性是指事务⼀旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

事务的并发问题

  • 脏读:读取到了没有提交的数据, 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的 数据是脏数据。

  • 不可重复读:同一个事务同⼀条命令返回不同的结果集(更新).事务 A 多次读取同一数据,事务 B 在事务A 多次读取的 过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。

  • 幻读:重复查询的过程中,数据发生了量的变化(insert, delete)

不可重复读和幻读的区别 - arun_yh - 博客园https://www.cnblogs.com/itcomputer/articles/5133254.html

 4种事务隔离级别从上往下,级别越高,并发性越差,安全性越高。 ⼀般数据默认级别是读已提交或可重复读

查看当前会话中事务的隔离级别
select @@transaction_isolation;
设置当前会话中的事务隔离级别 
set session transaction isolation level read uncommitted; 

读未提交(READ_UNCOMMITTED)

读未提交,该隔离级别允许脏读,其隔离级别是最低的。如果一个事务正在处理理某一数据,并对其更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。 

读已提交(READ_COMMITTED)

读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。 但是在同一个事务中执行同一个读取,结果不一致 不可重复读示例 可是解决了脏读问题,但是还是解决不了可重复读问题。

可重复读(REPEATABLE_READ) 可重复读就是保证在事务处理理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。(事务B修改并提交数据,若A事务还未提交,此时使用和B未提交前一样的查询语句,结果不变,只有当A也提交了,用该语句查询得到的结果才会更新) 因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。 幻读会导致同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。 

顺序读(SERIALIZABLE) 顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。

不同的隔离级别的锁的情况

  • 读未提交(RU): 有行级的锁,没有间隙锁(保证某个间隙内的数据在锁定情况下不会发生任何变化)。它与RC的区别是能够查询到未提交的数据。
  • 读已提交(RC):有行级的锁,没有间隙锁,读不到没有提交的数据。
  • 可重复读(RR):有行级的锁,也有间隙锁,每次读取的数据都是一样的,并且没有幻读的情况(可能会出现幻读)
  • 序列化(S):有行级锁,也有间隙锁,读表的时候,就已经上锁了

隐式提交

DQL:查询语句句 DML:写操作(添加,删除,修改) DDL:定义语句句(建库,建表,修改表,索引操作,存储过程,视图) DCL: 控制语言(给用户授权,或删除授权) DDL(Data Define Language):都是隐式提交。 隐式提交:执行这种语句相当于执行commit。

MySQL :: MySQL 5.7 Reference Manual :: 13.3.3 Statements That Cause an Implicit Commithttps://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值