数据库事务及锁理解
数据库事务的特性:原子性:事务中的所有操作,要么全部成功,要么全部失败
一致性:事务后数据满足符合一致性逻辑需求
隔离性:每个事务都有自己独立的空间,事务中间状态不会被其他事务看到。
但是根据事务隔离性的情况,分为四种隔离级别:
1.读未提交,A事务的中间状态会被B事务看到,这样会导致脏读。B事务读取到A事务对记录的修改并使用,后续A事务回滚了,那么B就发生了脏读
2.不可重复读,A事务读记录的时候,B事务可以修改该记录。但是只有B事务提交的时候,A事务才能看到B的修改,这样会导致不可重复读
例如A事务读取记录,B事务开始写同样的记录,并提交,这是A事务重新读取该记录,会发现前后两次读同一条记录值不同
3.可重复读,A事务开始读记录,B事务则只可读记录,不可修改记录,但是可以修改记录。这个不会有脏读,不可重复读。但是会出现幻读。
如果A事务对于所有记录按一定逻辑做update处理,这是B事务插入一条记录。或许A事务查看所有记录时会发现有记录不满足逻辑,出现幻读
4.串行,A事务未执行,不允许B事务开始执行。
持久性:事务提交后其修改会被持久化。
数据库锁:共享锁(读锁),排他锁(写锁)
数据库使用可重复读事务隔离级别的话:
用户持有读锁,其他用户可以进行读,但是不可以进行写
用户持有写锁,其他用户不可以进行读,也不可以进行写
数据库死锁:
数据库死锁常出现的两种场景:
如果数据库事务隔离级别是可重复读的话,以下两个场景都会出现死锁,如果是读已提交,应该不会出现死锁
1. A事务读取记录1,修改记录2,B事务读记录2,写记录1
2.事务1读取A记录,这时事务2修改A记录,然后事务1修改A记录