数据操作的流程:发起事务--锁定表--执行逻辑计算--完成事务--提交
事务
概念:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
每个操作逻辑要成为一个事务必须满足4个特点:
1.原子性:事务中的操作要么都不做,要么就全做。
2.一致性:事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
3.隔离性: 一个事务的执行不能被其他事务干扰。
4.持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
事务的4种隔离级别(略)。
事务运行的3种模式:
自动提交(略)。
显式提交(略)。
隐式提交(略)。
锁
1.分类:
行锁:对某一行数据进行锁定。适合高并发。锁的粒度较小,开锁大,解锁慢(需要查询该记录,较耗时),系统开销大,容易出现死锁。
表锁:对整个表进行锁定,不适合高并发。
悲观锁:默认一定有人会操作该数据,先锁定表,处理完之后再解锁,不适合高并发。一般属于数据库层面上实现锁(insert, delete, update, select .... for update)
乐观锁:默认没人会操作该数据,先查询,逻辑计算之后再查询该数据是否被占用,可能出现多次retry,导致效率底下,不适合高并发。属于在代码层面上实现锁。
2.死锁可能的产生原因:
表1需要等待表2未被占用时才能执行,但是表2也需要等待表1未被占用时才能执行。当表1和表2同时被操作时,可能导致这两个动作相互等待,导致进入死循环。
多个连接同时争抢锁资源,造成数据库资源耗尽
提高效率的方法
可能采取的措施:多个请求处理完之后再统一记录log并提交
可能导致的问题:中间某一个请求处理失败后,导致前面的几个请求也失败