一、原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。mysql
二、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。算法
三、隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。sql
四、持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。数据库
在数据库操做中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。咱们的数据库锁,也是为了构建这些隔离级别存在的。
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
一、脏读:事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据网络
二、不可重复读:事务 A 屡次读取同一数据,事务 B 在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果 不一致。并发
三、幻读:系统管理员A将数据库中全部学生的成绩从具体分数改成ABCDE等级,可是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉同样,这就叫幻读。性能
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表。优化
在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据什么时候被建立,另一个记录这行数据什么时候过时(或者被删除)。 在实际操做中,存储的并非时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。 在可重读Repeatable reads事务隔离级别下:code
经过MVCC,虽然每行记录都须要额外的存储空间,更多的行检查工做以及一些额外的维护工做,但能够减小锁的使用,大多数读操做都不用加锁,读数据操做很简单,性能很好,而且也能保证只会读取到符合标准的行,也只锁住必要行。排序
咱们无论从数据库方面的教课书中学到,仍是从网络上看到,大都是上文中事务的四种隔离级别这一模块列出的意思。
死锁是只两个或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源。从而致使循环的现象。当多个事务试图以不一样的顺序锁定资源时,就可能产生死锁。多个事务同事锁定同一个资源时,也会产生死锁。例如,两个事务同事处理stockprice表。
事务1: start transaction; update stockprice set close = 45.50 where stock_id = 4 and date = '2019-05-05'; update stockprice set close = 36.66 where stock_id = 3 and date = '2019-05-06'; commit 事务2: start transaction; update stockprice set high = 33.33 where stock_id = 3 and date = '2019-05-06'; update stockprice set high = 35.66 where stock_id = 4 and date = '2019-05-05'; commit
若是连个都执行了第一条update 语句,跟新了一行数据,同事也锁定了该行数据,接着每一个事务都尝试去执行第二条update语句,发现该行已经被对方锁定,而后两个事务都等待对方释放锁,同事又持有对方须要的锁,则陷入死循环。除非有外部因素介入才能解除死锁。
1. select_type:查询类型, 1. simple:通常是简单查询,不使用union或子查询 2. subquery:子查询中的第一个select 3. primary:最外层的select 2. type:mysql找到所需行的方式,又叫“访问类型”,由差到好的顺序: 1. type=ALL:全表扫描(通常须要进行优化) 2. type=index:整个索引扫描(不知足最左匹配可能会引发) 3. type=range:使用一个索引来检索给定范围的行 4. type=ref:mysql会根据特定的算法快速查找到某个符合条件的索引,而不是会对索引中每个数据都进行一一的扫描判断 5. type=eq_ref:相似ref,区别是使用的索引是惟一索引 6. const、system:常量匹配,主键匹配 3. rows:找到所需记录须要读取的行数(估计值) 4. extra:详细信息,常见: 1. Using index:只查询索引就能获得结果(覆盖索引) 2. Using where:须要经过索引再检索实际数据进行过滤 3. Using temporary:使用临时表 4. Using filesort:使用临时文件排序
1.每次老是被什么共享锁、排他锁给绕晕了。简单实际一点。就只有 读锁 写锁 两种锁。对应关系以下:
锁类型 | 描述 |
---|---|
共享锁(读锁 | 其余事务能够读,但不能写。 |
排他锁(写锁) | 其余事务不能读取,也不能写。 |
2.乐视锁和悲观锁
悲观锁:是借用mysql InnoDB 行锁来实现的(where 条件必需要加索引)。
select * from user whereid = 10 for update
3.行锁和表锁
4.其余mysql 内部实现的锁机制
隐式锁、间隙锁等。