1.事务是什么?
2.acid特性
3.隔离级别
4.实现:mvcc锁undolog redolog
5.并发异常 读异常 死锁
目的:事务讲数据库从一种一致性状态转换成另一种一致性状态。
组成:事务可以是简单的一条语句,可以是一组语句。
ACID特性
事务回滚操作依靠undolog来实现,每操作一句,undolog都会记录,回滚时,会做相反的动作。undolog存储在共享表里。
redolog:事务提交后,事务DML操作将会持久化(写入redolog磁盘文件 哪一个页 页 偏移值)即使发生宕机等故障,数据库也能将数据恢复。redolog记录的时物理日志。
MVCC提供了一种快照读的方式提高并发性能。
mvcc 在sql后不加任何参数时快照读,
当前读:加lock in share mode是共享锁,加for update是排他锁,insert ,update,delete
myisam只支持表锁
隔离级别:
隔离级别越高并发性能越低,
隔离级别由低到高:
read uncommitted:读未提交,该级别下都不加锁,写加排他锁,写锁在事务提交或回滚后释放锁; 容易产生读异常;
read committed:该级别支持MVCC(多版本并发控制),也就是提供一致性非锁定读。此时读取操作读取历史快照数据;该隔离级别下读取历史版本的最新数据,所以读取的是已提交的数据。
repeatable read:可重复读:此时读取操作读取事务开始时的版本数据; mysql默认这个级别,自动添加排他X锁
serializable:可串行化,该级别下给读加了共享锁,所以事务都是串行化的执行,此时隔离级别最严苛。
select * from table lock in share mode;加读锁
select * from table for update;加写锁
排他锁:删除和更新时自动添加X锁,插入时,1.会先添加插入意向锁,insert intention lock,然后再把这个数据加上X锁,2.如果是自增,会添加auto-inc lock,自增锁
意向共享锁:对一张表中某几行加的共享锁
意向排他锁:对一张表中某几行加的排他锁
目的:为了告诉其他事务,此时这张表被一个事务在访问,作用:排除全表读写锁
如果是走的辅助索引,则只会给辅助索引加gap锁
事务开始前加锁持续锁,事务提交或者回滚的时候,释放锁
脏读:隔离级别为读未提交,一个事务读到另一个事务修改的数据(未提交),造成数据错乱。解决办法:提升隔离级别到读已提交
不可重复读:在隔离级别为读已提交或读未提交,同一个事务中,两次查询同一行的数据不一致。发生在两次查询之间有其他事务修改了这一行的数据。解决办法:提升隔离级别到可重复读
幻读:同一事务中,两次查询同一范围出来的结果集不一致。 解决办法:加共享锁,让写的事务阻塞
丢失更新:回滚覆盖,B事务修改一个数据后提交,此时A时候回滚会回滚到之前的版本。数据库拒绝不可能发生。
提交覆盖,两个事务同时操作一个数据,最后操作并提交的会覆盖前一个操作的数据。解决办法:加锁,共享锁或者写锁
共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
死锁的一个典型场景:事务A先申请数据行1的共享锁,然后申请数据行2的排他锁。事务B先申请数据行2的共享锁,后申请数据行1的排他锁。结果事务A和B申请完共享锁后,申请排他锁的请求都被对方block住了,导致死锁。
搜索
复制
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/database/281346.html