今天,没什么事就来写写博客了,这回让我们来了解一下平时用的数据库事务的四个特性ACID.
A:atomatic(原子性)
C:consistency(一致性)
I :isolation(隔离性,独立性)
D:durability(持久性)
事务的原子性是指整个逻辑过程是一个整体,不可分割;一致性是指数据库的表的约束,级联,触发器,要前后保持一致;持久性是指事务提交后,数据可重复读。
最不容易理解的就是隔离性。首先,如果事务不设置隔离性就很可能在某些情况下会有问题。以下是可能出现的问题
一、脏读
事务A读取了事务B未提交的数据,从而导致与实际的数据不符合。比如,事务A想要购买苹果手机,先读取了数据库的手机存量还有100台,但是事务B也是先读取了手机存量100台,然后把它设置为99台,但是未提交,此时事务A读取的数据就只有99台,很不巧,事务B购买失败,回滚,那么数据库实际剩余的量还是100。试想,如果事务A成功购买了一台并把它设置98,那么数据库的数据就不对了。这个例子就叫事务A的脏读。
二、不可重复读
由于事务B的可提交读,导致事务A两次读取的数据不一致。
三、幻读
事务的隔离级别为可重复读时,事务B提交了之后,事务A查询的数据还是和之前的数据一样。
以上问题的本质都是因为事务在读取数据的时候并没有防止并发的其他事务读取数据的时候会不会更改数据。所以,为了防止出现这种情况,我们要把隔离级别设置为Serializable.
SET SESSION TRANSACTION ISOLATION LEVEL Serializable;
select p.productName,p.productCount from product p where p.productId=1 for update; for update 字段是让数据库事务读取这一行的时候加锁,那么其他事务就无法读取这一行,但是这样的性能肯定会受影响。那怎么办呢?
下面我们来看看乐观锁和悲观锁。敬请期待,哈哈哈。
转载:https://juejin.im/post/6844903817138405383 |