事务的特性:
1,原子性:不可分割
2,一致性:事务执行前后,要保证数据完整性保持一致
3,隔离性:一个事务的执行过程中不应该受其他事务的干扰
4,持久性:事务一旦执行结束,数据要永久持久化到数据库
如果不考虑隔离性会引发的一些问题:
读问题:
脏读:一个事务读到另一个事务未提交的数据
不可重复读:一个事务读到另一个事务已经提交的update数据导致前后查询不一致
虚读:一个事务读到另一个事务已经提交的insert的数据导致前后查询不一致
如何避免读问题:
设置事务的隔离级别:
未提交读;
已提交读;
可重复读;
串行化;
写问题:
丢失更新:另一个事务提交或回滚的数据将一个事务提交的数据覆盖了。
多个事务修改同一条记录,A事务修改记录的年龄字段。B事务修改了记录中工资字段。A先提交了
B事务回滚导致A事务修改的记录被覆盖
B事务提交导致A事务提交的记录被覆盖
解决丢失更新问题:
悲观锁:就是很悲观,每次都认为会有人对数据库进行了修改,所以每次在拿数据的时候,都会上锁,这样别人想拿这个数据的时候就会锁住直到它拿到这个锁才能进行操作,传统数据库中很多时候都用到了这种锁机制,比如行锁,表锁等。
乐观锁:很乐观,认为每次去拿数据的时候别人没有进行修改,但是每次更新数据的时候都会判断一下别人是否对数据进行了修改,乐观锁适用于多读的情况,这样可以增加吞吐量。
两种锁各有优点,乐观锁只用于写很少的时候,这样可以省去了锁的开销,如果经常发生冲突,要使用悲观锁。