https://blog.csdn.net/fuzhongmin05/article/details/91126936
ACID
原子性、一致性、隔离性、持久性
原子性是事务的所有操作要么都执行,要么都不执行。事务的操作是一个整体,不可分割的。
一致性是事务提交前加事务应该造成的影响和提交后的数据保持的一致性。一致性的实现依赖于原子性和隔离性。
持久性是事务提交后,将直接修改到数据库,不可再回滚,撤销操作。
事务的隔离级别,是针对事务的整个过程来说的,事务的过程需要 开始事务、执行操作、提交事务、持久化到数据库。
不同的事务隔离级别在持久化之后,会有不同的效果,并不一定都是正确的,会有脏读、重复读、幻读等问题。
隔离的级别我认为是加锁的级别,加锁的范围。
- 读未提交。事务已读、未提交,相当于不加锁,都来操作,操作马上就执行到数据库,高并发下数据会非常乱,三个问题都会有。
- 读已提交(重复读,并修改会出现问题)。事务读取、提交为一个完整操作,最后一起执行到数据库。也是不加锁的。但是A读时是20改为30.B读20改为25.A提交后为30,B又提交为25,则A的结果就错了。
- 可重复读。加锁,不能同时操作,每个事务读并持久化之后,下一个再读,持久化。避免了update和delete的影响,但是还会受insert的影响。如查询id>10,第一次10条,第二次15条,即为幻读。
MySql数据库默认隔离级别为可重复读,但是因为MySQL采用了间隙锁(gap lock),所以实际上MySQL的RR隔离级别也解决了幻读的问题。
执行计划中扫描范围即为行锁范围。
- 串行化。直接锁表,如查询id>10,那么其他操作这个表的就要等待,效率极差。但可避免上述的所有问题
如何避免死锁(产生原因)?
https://www.cnblogs.com/wezheng/p/8366029.html
- 事务之间对资源访问顺序的交替。不要发生先后交叉访问,要 有一定顺序性。
- 并发访问同一资源。
- 数据库索引不当或过少,导致查询上升为全表扫描。
如果解决死锁?
1)抢占资源:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
2)终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态
https://blog.51cto.com/364879551/2088611
执行查询进程命令,根据进程状态(wating for..)和消耗内存来判断死锁线程