基于MySQL的关系型数据库完成情况_关系型数据库---MySQL---事务

1、概述

1.1  事务:在对业务相关的一系列数据进行操作时,需要保证数据操作的完整性(要么全部成功、要么全部失败);

1.2  MySQL中支持事务的存储引擎是:Innodb;

1.3  事务用来管理insert、update、delete语句;

1.4  事务必须满足的4个条件(ACID):

1.1.1  Atomicity(原子性)

一个事务的所有操作,要么全部成功、要么全部失败

1.1.2  Consistency(一致性)

在事务开始之前、事务结束之后,数据库的完整性没有遭到破坏

1.1.3  Isolation(隔离性)

数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多个事务执行时由于交叉执行而产生数据的不一致;

事务的隔离级别:读未提交read uncommitted、读提交read committed、可重复读repeatable read、串行化Serializable;

1.1.4  Durability(持久性)

事务处理完成后,对数据的修改是永久性的;

2、事务控制语句

begin(start transaction):      显示开启事务

commit(commit work):        事务提交(事务提交后对数据进行的修改称为永久性)

rollback(rollback work):         事务回滚(撤销之前对数据库的所有操作)

savepoint 保存点名称:          在事务中创建一个保存点(一个事务中可有多个savepoint)

release savepoint 保存点名称:      删除一个事务中的保存点(如果事务中不存在保存点,会抛出异常)

rollback to 保存点名称:        把事务回滚到保存点

set transaction:            设置事务的隔离级别(Innodb存储引擎支持的隔离级别:读未提交read uncommitted、

读提交read committed、可重复读repeatable read、串行化Serializable)

set autocommit=0          禁止事务自动提交(关闭自动提交后,从下一条指令开始开启新的事务,需要使用commit或rollback结束该事务)

set autocommit=0          开启事务自动提交

3、案例

【注意】:

默认情况下,每条SQL语句都可以视为一个事务,SQL执行完成后,自动执行commit;

通过begin或者set autocommit=0来禁止事务自动提交;

//每个命令后必须加分号,不然报语法错误

BEGIN;INSERT INTO `user`(name,age) VALUES('lili',27);INSERT INTO `user`(name,age) VALUES('lili',28);ROLLBACK;

BEGIN;INSERT INTO `user`(name,age) VALUES('lili',27);INSERT INTO `user`(name,age) VALUES('lili',28);COMMIT;

SET autocommit=0;INSERT INTO `user`(name,age) VALUES('lili',27);INSERT INTO `user`(name,age) VALUES('lili',28);COMMIT;

4、并发事务  引起的问题:

脏读:

一个事务读取到了  另一个事务修改但是未进行事务提交的数据,一旦 另一个事务进行回滚,就会造成脏读;

案例:

左侧、右侧事务隔离级别设置为'read-uncommitted';

左侧手动开启事务,对id=1的数据进行更新,但未进行事务提交;

右侧对id=1的数据查询,会读取到左侧事务未提交的数据;

造成数据的脏读;

8ab36a2282e863ab0c56d84a8b1a7100.png

不可重复读:

一个事务执行相同的多次查询,但每次的结果都不一样,因为另一个并发事务在查询期间对数据作了修改;

案例:

左侧、右侧事务均设置为'read-committed';

左侧对id=1的数据进行更新, 并事务提交;

同时,右侧对id=1的数据查询,发现数据已经更新;

造成数据的不可重复读;

0ec177891c85f2c580070e217f846979.png

幻读:

一个事务执行相同的多次查询,发现每次查询的数量不一致,因为在查询时另一个并发事务对数据作了新增或者删除;

5、并发事务  隔离级别:

d752224f8bd90854c934611969d9b249.png

read uncommitted:

允许读取尚未提交的数据;

会造成脏读、不可重复读、幻读;

read committed:

允许读取已提交的数据;

会造成不可重复读、幻读;

repeatable read:(MySQL默认的隔离级别)

可重复读;

案例:

左侧、右侧隔离级别设置为'repeatable-read';

左侧手动开启事务,对id=1的数据进行更新,但事务未提交;

同时,右侧手动开启事务,进行id=1的数据读取;

解决了脏读的问题;

73a6737bee76f5f3327a80806bae9b19.png

接上述;

左侧事务提交,id=1的数据更新为666;

右侧对id=1的数据进行查询,结果仍为600;

解决了不可重复读的问题;

65e21f65770cffbd2f90705cb56ce5ff.png

接上述;

左侧新增一条数据,并自动进行事务提交;

右侧进行查询,发现没有读取到新增的数据(从快照中读取的,保证可重复读);

右侧对新增的数据进行更新,发现成功;

造成幻读;

340560a665a9b0313939301ea7874bd0.png

Serializable:

最高的隔离级别,可防止脏读、不可重复读、幻读的发生;

性能比较低;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值