-
事务(默认自动提交,可以设置set autocommit=0关闭自动提交,不建议关闭自动提交)
- 事务的特性
- 原子性(Atomicity)
操作要么全部执行成功,要么全部失败,保证数据的一致性; - 一致性(consistency)
数据库的数据在操作前后必须满足业务规则的约束。甲乙账户的总金额在转账前和转账后必须一致; - 隔离性(isolation)
数据库允许多个并发事务同时对数据库进行读写和修改,防止事务并发执行时由于交叉执行而导致的数据不一致。
比如用户甲乙之间进行转账操作的同时,用户丙向用户甲进行转账;如果同时进行,甲乙账户之间的一致性不能达到满足;所以在甲乙事务执行过程中,其他事务不能访问(修改)当前相关的数据。 - 持久性(durability):事务结束后,对数据的影响是持久化的,不可修改的。
- 原子性(Atomicity)
- 事务语句:begin开始,commit|rollback结束;它是一组DML语句的集合;
- truncate和delete区别
truncate 是DDL语句,delete是DML语句,
共同点:清空表内的数据
区别:- 在事务内,truncate不能回滚,delete可以回滚;2.
- 并且truncate会清空表的自增属性,使自增属性重新从1开始;
- delete from table_name;
- truncate table table_name;
- 事务的隔离级别:四种
- 读未提交read uncommitted简称RU;在一个事务中,可以读取到其他事务未提交的数据变化,产生脏读dirty read,不建议使用;
- 读已提交 read committed 简称RC;在一个事务中,可以读取到其他事务已经提交的数据,这种读取也叫做不可重复读;可能会产生幻读现象;是Oracle默认的事务隔离级别;
- 可重复读repetable read 简称RR,是MySQL默认的事务隔离级别;在一个事务中,直到事务结束前,都可以反复读取到事务刚开始看到的数据,并不会产生脏读、幻读、不可重复读
- 串行serializable在每个读的数据行上都需要加表级别的共享锁,在每次写数据库时,都需要加上表级别排他锁,这样会造成innoDB的并发性能下降,发生大量的超时和锁竞争,不建议使用。
- 脏读:在事务隔离级别为读未提交中出现的现象。一个事务读取到了其他事务尚未提交的数据;
- 不可重复读:在一个事务中,读取到了其他事务针对旧数据的修改记录(常见的操作就是update、delete语句)。发生在RC隔离级别中。
- 幻读:在一个事务中读取到了其他事务新增的数据,仿佛出现幻觉(常见与insert语句)。发生在RC隔离级别中。
- 可重复读:
- 事务的特性
-
锁
-
概述:不同的存储引擎,支持不同的锁;InnoDB支持行锁,有时也可以升级为表锁,但是MyISAM只支持表锁。
-
表锁的特点:开销小、加锁块、不会出现死锁、锁粒度大、发生锁冲突几率大、并发性低
-
行锁的特点:开销大,加锁慢,会出现死锁,锁粒度小、发生锁冲突几率低、并发性较表锁高。
-
innoDB的锁类型:
-
读锁(共享锁)
简称S锁,一个事务获取了一个数据行的读锁,其他事务可以继续获得该数据行的读锁,但是其他事务不能获取这个行数据的写锁,不能对这条数据进行增删改操作。
使用select ...lock in share mode ;--在被读取的行记录或者行范围上加上一个读锁,其他事务可以读,但是要想申请写锁,就会被阻塞;
-
写锁(排他锁):
简称X锁,一个事务获取了一个数据行的写锁,其他事务就不能获得该该的其他锁,写锁优先级最高。
select … for update 会加上一个写锁; -
MDL锁
MySQL5.5版本中增加的meta data lock 元数据锁,保证表中元数据的信息。在一个会话a中开启了查询事务后,会自动获得MDL锁,会话b就不能执行任何DDL语句操作。 -
意向锁
-
-
MySQL相关书籍的读书笔记(六)
最新推荐文章于 2022-04-25 17:23:47 发布