Atomic : 原子性(看作一个原子操作)Consistency: 一致性(没有提交就不会保存)Isolation: 隔离性(4种隔离级别,事务之间通常不可见)Durability: 持久化(提交之后保存到数据库持久化, 系统崩溃也不会丢失) 事务隔离级别 1、Read Uncommitted 读未提交
没有提交的内容也会被其他事务读取, 可能导致脏读
2、Read Committed 读提交提交的内容才会被其他内容读取
3、Repeatable Read 可重复读 (MYSQL 默认)B事务第一次读取该行的时候A事务没有提交,
A事务提交修改该行
B第二次读取该行的时候数据不一致了
保证一个事务的多次读取该行数据一致
幻读:
B事务第一次读取该行的时候A事务没有提交,
A事务提交在该行下面增加一行
B第二次读取该行和其接近的数据发现数据多了, 感觉出了幻觉
InnoDB 通过 MVCC 多版本并发控制解决了幻读问题
4、Serializable 可串行化读取每一行都加锁, 性能很低, 一般不用, 除非可以接收没有并发
死锁 什么是死锁A事务等待B的事务释放才能执行, B事务等待A的事务释放才能执行
A事务
start transaction;update user set user.age = 18 where user.id = 1;update user set user.age = 19 where user.id = 2;commit;
B事务
start transaction;update user set user.age = 20 where user.id = 2;update user set user.age = 21 where user.id = 1;commit;
如果 A, B 同时执行了第一个 update , update 会加锁
A 将 第 1 行锁定
B 将 第 2 行锁定
A 需要获取第2行锁才能执行第二个 update
B 需要获取第1行锁才能执行第二个 update
死锁的解决数据库自身实现了各种死锁的检查和超时机制, 一般检测到死锁就返回错误
InnoDB 目前处理死锁的方法是, 将支持最少锁的事务回滚
MVCCInnoDB 的 MVCC 是通过在每一行下面多记录 2 个隐藏列来实现的, 创建版本号和删除版本号
insert 新建行当前系统的版本号作为创建版本号
delete 删除行当前系统的版本号作为删除版本号
update 修改行当前行的创建版本号作为删除版本号当前系统的版本号作为创建版本号
这 2 版本号的设计可以让大多数读操作都不加锁, 就对版本号进行检查就解决幻读问题
refrence高性能 MYSQL 第三版