mysql事务 锁 回滚 键6_MySQL事务与锁

MySQL事务与锁

1、事务的四大特性(ACID)

1.1、原子性,原子性指整个数据数据库的每个事务都是不可分割的单位。只有十五中所有SQL语句都执行成功,才算整个事务成功,事务才会被提交。如果事务中任何一句SQL执行失败,整个事务都应该被回滚。

1.2、一致性,是指数据库将一种一致性状态转换为另一种一致性状态。不允许数据中的数据出现新老数据都有的情况,要么都是老数据,要么都是新数据。用更书面化的表达就是:数据的完整性约束没有被破坏。

1.3、隔离性,是指一个事务在该事物提交前对其他事务都不可见,它通过锁机制实现。

1.4、持久性,是指事务一旦被提交,其结果是永久性的。即使发生宕机等故障,数据库也能将数据恢复。

2、事务的环依赖

MYISAM 引擎不支持事务,INNODB 引擎支持事务。

ps:两表引擎的其他区别见博文 https://blog.csdn.net/qq_35642036/article/details/82820178

3、事务的语法

#开启事务,两种语法

begin

start transaction

#提交事务

commit

#回滚事务

rollback

#建立保存点(一个事务可以有多个保存点)

savepoint xxx

#删除保存点(没有该保存点时会抛出异常)

release savepoint xxx

#回滚事务到某个保存点

rollback to [savepoint] xxx

#检查事务的自动提交状态

show variables like '%commit%';

#修改事务的自动提交方式(仅保持一个连接时间,断开连接就失效)

--全局修改

set global autocommit=0;

--局部修改

set session autocommit=0;

4、锁的类型

4.1、表级锁:锁住整张表。特点:开销小,加锁快,锁冲突概率高,并发度小。(myisam,innodb,memory存储引擎支持)

4.2、行级锁:锁住一条数据。特点:开销大,加锁慢,锁冲突概率性小,并发度大。(innodb存储引擎支持)

4.3、页级锁:锁住一页数据。特点:以上特点折中。(innodb中一页数据为16kb)(innodb,BDB存储引擎支持)

5、innodb锁的类型

5.1、排它锁:当某一事务给一行数据加上排他锁时,那么其他事务对此行数数据不能读,不能写,也不能喝其他事务一起使用

5.2、共享锁:当某一事务给一行数据加上共享锁时,其他事务可以对此行数据进行读操作,但是不能写,不能与排他锁一起使用

对于update、delete、insert语句,InnoDB会自动给涉及到的数据加排它锁。

对于select语句,InnoDB不会加任何锁

5.3、语法:

#排它锁

select xxx from 表名 where ... for update;

#共享锁

select xxx from 表名 where ... lock in share mode;

5.4、测试:

排它锁:

加排他锁后,另一个排它锁查询

e8b8b678439ba082e76cf8374fc568ca.png

加排他锁后,使用共享锁查询

4ffe461ca3e0cf4c94b02c7dd9423ed5.png

共享锁:

加共享锁后使用另一个共享锁查询

6c8b897c2c2e7dd9eee7a5bb377a39ec.png

加共享锁后,使用排他锁查询

1cbd18159b9f474cfdeb048195bbc3a3.png

加共享锁后,更新数据

1f7dac353a606317fbcba111ceabc533.png

6、事务的生命周期

316bbdc02e64268294facbd81b701ba4.png

check point:检查点,检查点前的事务都是已经提交或回滚过的。

ps:MySQL的checkpoint https://www.cnblogs.com/lintong/p/4381578.html

undo log:回滚日志,存储在共享表空间的ibdata*文件,存储的是 check point日志序列号。

redo log:重做日志,存贮子日志文件ib_logfile里。

6.1重做日志

mysql通过重做日志实现事务的持久性。重做日志有两部分组成,一是内存中的重做日志缓存区(易丢失),另一个是磁盘上的重做日志,它是持久的。

2fdb42acc7300df3ca37f41137d6e1ce.png

当在事务中执行写操作时,它会先把数据从磁盘读入内存,并更新内存中缓存的数据,然后生成一条重做日志并写入重做日志缓存,当事务真正提交时,MySQL会将重做日志中的内容刷新到重做日志文件,再将内存中的数据更新到磁盘上。

重做日志执行时间:

在mysql中事务执行commit提交后,但服务器挂了,数据并未写入磁盘,在mysql重启服务后会重新执行这个重做日志写入数据。

6.2、回滚日志

mysql通过回滚日志保证事务的原子性。事务回滚的本质是在sql执行之前在回滚日志中生成了一条相反的sql。

b735784786f875efa10b0caaf0a2a35e.png

回滚日志执行时间:

1、执行rollback回滚语句时

2、在事务执行之后,提交命令执行之前出现异常,在下次mysql服务重启时会执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值