一 锁的分类以及实现
1.1 锁概念
共享锁:共享锁加上了,只能读不能写,事务a和事务b都可以读数据,但是如果事务a加上锁,事务b
可以读,但是不能写,只有事务a可以写
排他锁:排他锁加上了,其他事务既不能读也不能写,会把加锁的所有数据锁上,比如事务a和事务b
事务a加上了行锁,事务a可以对加锁的数据进行读和写,但是事务b只能等待事务a commit完,事务a
释放掉锁,事务b才会读和写
行锁:语义上很容易理解,就是事务一行加锁,比如sql语句:
select * from merchent_order where id = 1 for update
因为id是主健,默认对id=1的数据进行加锁,锁住一行数据
表锁:锁整个表,比如sql语句:
select * from merchant_order for update;
对整个表进行加锁。
悲观锁:比如mysql的for update,禁止其他事务进行读写操作,实际上在高并发场景下,对整个系统的吞吐性来讲,比较差,在数据很严格要求一致性的情况下,这种加锁方式有效,但是会牺牲系统的性能,所以一般在系统查询占比很多的情况下会加乐观锁,
乐观锁:加上版本号就可以实现乐观锁,类似java的CAS机制,具体实现sql:
update merchant_order set num = num+1 where version = ${version}
1.2 mysq事务隔离级别
读未提交:最低的事务隔离级别,事务a可以读取事务b提交的数据,可能出现脏读,幻读
读已提交:事务a可以读取事务b提交的数据,可能出现幻读,不允许任何中间状态出现,所以
不可能出现脏读,可能出现不可重复读。
备注:不可重复读(第一次和第二次读取的数据可能不一样),可重复读(第一次和第二次查询
的数据一致)
可重复读:多次同一个事务读取的事务是一样的,没有幻读出现,也没有脏读
串行化:读取的时候,默认加共享锁,等一个事务执行完,下一个事务才能开始执行,更新需要获取
排他锁,是最高的隔离级别
网友评论