锁、MVCC可以帮助解决数据库事务遇到的问题。事务协助管理释放锁。实际上锁更多是灵活解决业务上的问题,比如是否使用锁,用什么锁类型。锁是性能与数据准确的权衡,事务是性能与数据一致的权衡。通常,稍复杂的事务通过使用锁来保证数据准确。
开发过程中,事务控制越小越好,锁范围控制越小越好,以达到提高性能。spring的transactionTemplate可以灵活控制事务的范围,很多大厂、金融公司选择使用。
一、tips
1、数据库事务隔离级别有read uncommit, read commit,reapeat read,串行。解决的问题:脏读,不可重复读,幻读。
2、锁有共享锁也称读锁、排他锁也称写锁。按加锁位置分为:表锁、行锁、间隙锁、next-key锁。
3、事务隔离级别、记录行数,影响加锁的类型。
4、start transation不会加锁。sql语句显式或隐式加锁。
5、事务提交或回滚辅助释放锁。单条sql也算隐式事务的话。
6、简单selec为快照读,select * for update为当前读。
7、事务作用:保证数据一致(ACID)、释放锁。锁作用:保证数据准确。
二、验证
- start transation不会加锁。sql语句显式或隐式加锁。
窗口A开启事务,执行select for update
窗口B不开启事务,执行update。窗口B阻塞,直到超时。表明加锁时机在sql上,锁释放由事务控制。
- 简单selec为快照读,select * for update为当前读。
窗口A,开启事务,执行select *
窗口B,开启事务,执行update,并commit
这个时候,窗口A分别执行select 和selec for update,结果不一样。表明前者为快照读,后者为当前读。