自己之前一直对这几个概念搞不清楚,这里做一个小的总结,方便以后查看。
事务:
定义:是构成单一逻辑工作单元的操作集合;
事务ACID特性:
- 原子性(Atomicity):是一个整体,像原子一样不可分割,要么全部成功,要么全部失败;
- 一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态;
- 隔离性(Isolation): 并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。
- 持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。
关于事务的详细介绍和实现原理可以参考:https://www.cnblogs.com/takumicx/p/9998844.html
锁:
定义:锁是数据库事务调度的一种控制的手段,
特性:
- 每一数据元素都有唯一的锁;
- 事务在读写数据前,要获得锁;
- 事务被其他事务持有该元素的锁,则要等待;
- 事务处理完成后要释放锁;
数据库管理系统对事务的控制
之前不了解事务、锁这些知识,一直以为事务/锁都是程序员自己通过代码控制的,其实数据库管理系统自身有事务调度器,并综合考虑并发性能和事务隔离,取一个平衡。
Mybatis 乐观锁、悲观锁
个人理解这可以说是程序级别的锁,通过给数据库增加一个字段(比如version),每次更新都给这个version+1,在更新的时候判断此时数据库中这条数据的version值是否与取出时相等,以此解决两个用户操作同一条数据,后边的操作者在不知情的情况下覆盖了前者的操作;
@Transcation注解
spring声明式的事务管理,在具体的方法上添加该注解,如果抛出异常,事务会自动回滚,数据不会插入数据库。