MySQL的事务认识
什么是事务?
事务,就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内 的所有SQL都将被取消执行。
事务的ACID原则 (四大原则)
原子性:意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行。
一致性:即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性:意味着在事务完成以后 ,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
MySQL实现事务的方法步骤
-- 事务的操作
-- 1. 关闭自动提交
set autocommit = 0;
-- 2. 开始事务
start transaction;
-- 3. 一组sql语句
update bank set bmoney = bmoney-1000 where bname='葛二蛋';
update bank set bmoney = bmoney+1000 where bname='王铁牛';
-- 4. 结束事务(判断)
-- 提交
commit;
-- 回滚
rollback;
-- 5. 开启自动提交
set autocommit = 1;
MySQL中的锁
锁分类:
基于锁的属性分类:共享锁(读锁,S锁),排他锁(写锁,X锁)。
基于锁的粒度分类:表锁,行锁(记录锁,间隙锁,临建锁)
基于锁的状态分类:意向共享锁,意向排他锁。
事务的隔离级别
事务并发问题:
在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写,脏读,重复读,幻读的问题。
事务的隔离级别:
read_uncommitted | 读未提交 | 解决问题: 脏写 |
---|---|---|
read_committed | 读提交 | 解决问题:脏写,脏读 |
repeatable_read | 可重复读 | 解决问题:脏写,脏读,不可重复读,幻读(mysql的innodb存在) |
serializeable | 串行化 | 不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束 |
InnoDB的MVCC
MySQL的多版本并发控制(MVCC)是⼀种⽤于实现事务隔离的技术,它允许多个事务在同⼀时刻对同⼀数据进⾏操作⽽不互相阻塞。MVCC通过维护数据的多个版本来实现这⼀点,每个事务看到的数据版本是基于该事务开始时的数据版本。
InnoDB就是通过MVCC机制解决可重复读中的幻读问题。
MVCC的优点
-
提高并发性能
-
减少锁争用
-
简化事务管理
MVCC的缺点
-
额外的存储开销
-
垃圾回收开销