数据库
首页 > 数据库> > mysql事务

mysql事务

作者:互联网

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住了,导致死锁。

搜索

复制

标签:事务,隔离,数据,提交,mysql,共享,级别
来源: https://www.cnblogs.com/cuijy1/p/16275178.html