数据库事务并发产生的问题和封锁协议以及数据库隔离级别

  1. 数据库事物并发带来的问题

(1)脏写、丢失更新
都是讲2个事物并发执行的时候一个事物覆盖了另外一个未提交的事物的值
(2)脏读
一个事物度读取了另一个未提交事物的值(修改过的值)。
(3)不可重复读
一个事物b读取了另一个未提交事物a的值x=0,a修改x=10,b第二次读到的数据和第一次不一致。
(4)幻读
同样的查询条件由于a事物插入了数据 导致读到的数据量不一样。比如b读取x=10的数据有1条数据,a插入20条x=10的数据,b再次读取就有21条了。
2. 不同数据库的隔离级别
所有的数据库事物都不会允许脏写
所以有

				 脏读     可重复读   幻读
读未提交       	  x 		x 	 	x
读已提交       	  √ 		x		x
可重读读       	  √ 		√ 		x
串行化        	  √ 		√ 		√
  1. 三段锁协议
    x 锁:写锁,在未释放前其他事物对这条记录不能加s锁和x锁;s 锁:读锁,在未释放前其他事物对这条记录能加s锁不能加x锁

    一段锁协议是指在事物中写数据时必须加x锁;加了x锁就可以其他事物就必须等待释放掉,不会出现2个不同事物修改到同一个事物的值,就能解决掉脏写和丢失更新。读数据不会加任何锁,所以就算a加了写锁,b事物也能直接都到脏数据。
    二段锁协议是在一段锁协议的基础上读取记录会加s锁,并且在未提交前就可以释放掉;从上面脏读的定义b事物想读取要加s锁,而这个时候a如果要修改就会对这条记录加了x锁,b就需要等待a事物结束才能读取(重点在b读的时候要加s锁)。因为b未提交就释放了锁,所以a是可以继续修改记录,这个时候会发生不可重复读。
    三段锁协议是在一段锁协议的基础上读取锁会加s锁,并且在提交后才可以释放掉。因为b读取加了s锁,并且直达都事物提交都不会释放,所以a事物在b提交之前都不能加上x锁,就可以防止不可重复读

你可能感兴趣的:(MYSQL,杂记,读书笔记,数据库)