一、什么是事务?
事务是代表单个工作单元的一组SQL语句,它确保这些语句要么全部成功,要么全部失败回滚。(想象一下,你去银行转账。你要把一笔钱从一个账户(账户A)转到另一个账户(账户B)。这个转账过程可以看作是一个事务。)
事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID。
二、事务的四个特征(ACID)
原子性:事务中的所有操作要么全部完成,要么全部不完成。(转账过程中,如果第一个操作(从账户A扣钱)成功了,但第二个操作(加到账户B)失败了,那么整个转账就不算成功。银行需要把第一个操作撤销,也就是把你账户A的钱再加回去。这就是原子性,要么两个操作都成功,要么都不成功。)
一致性:事务完成后,数据库必须从一个一致状态转化到另一个一致状态。(转账前后,你的总金额应该是不变的。如果你从账户A转了100元到账户B,那么转之前和转之后,账户A和账户B的总金额应该是一样的。事务确保了这个一致性)
隔离性:一个事务的执行不应影响其他事务的执行。(当你在做转账的时候,其他人也在做转账。你的转账操作不应该影响到别人的转账,别人的也不应该影响到你的。每个转账操作都是独立的,这就是隔离性。)
持久性:一旦事务提交,其结果应该永久保存在数据库中,即使系统发生故障。(一旦转账成功,这笔交易就不能再被撤销了,即使银行系统突然断电或者出现故障。这就是持久性,一旦事务提交,它的效果就是永久的。)
三、什么是脏读、不可重复读、幻读?
1.脏读:
脏读是指一个事务读取了另一个事务未提交的数据。如果那个事务后来回滚了,那么读到的数据就是无效的,就像是读到了一个“脏”的数据。
(举例:假设你在查看商品库存,另一个工作人员正在更新库存数据但还没完成。你看到的库存数量是那个工作人员还没改完的数字,然后那个工作人员取消了操作,你读到的库存数量就不准确了。)
2.不可重复读:
不可重复读是指在一个事务内,多次读取同一数据集合时,由于其他事务的介入,读取的结果不一致。
(举例:你第一次查看商品价格是100元,然后你再次查看同一个商品的价格,由于另一个工作人员已经更新了价格,你看到的变成了110元。这就是不可重复读,因为同一个事务中两次读取的结果不一致。)
3:幻读:
幻读是指在一个事务内,两次执行查询时,由于其他事务的插入或删除操作,返回的记录数不一致,就像是出现了“幻影”。
(举例:你在统计某类商品的总数,第一次统计是100件,然后你再次统计,由于另一个工作人员在此期间添加了新商品,你看到的总数变成了105件。这就是幻读,因为两次查询的结果不一致,而且这种不一致是由于其他事务新增或删除记录造成的。)
四、SQL的四个隔离级别
读已提交(Read Uncommitted):
一个事务能够读取到别的事务中没有提交的更新数据。事务中的修改,即使没有提交,其他事务也可以看得到。在这种隔离级别下有可能发生脏读,不可重复读和幻读
读未提交(Read Committed):
事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下解决了脏读,但是有可能发生不可重复读和幻读。
不可重复读(Repeated Read):
保证了在同一事务中先后执行的多次查询将返回同一结果,看到的每行的记录的结果是一致的,不受其他事务的影响。但是这种级别下有可能发生幻读。
可串行化(Serializable)
不允许事务并发执行,强制事务串行执行。就是在读取的每一行数据上都加上了锁,读写相互都会阻塞,所以效率很低下。这种隔离级别最高,是最安全的,但是性能最低,不会出现脏读,不可重复读,幻读。
以上就是对事务的一些基础的理解,希望对大噶获有用!