什么是数据库事务?事务所具有的四个特性是什么?
事务是一组不可分割的数据库操作,是数据库并发控制的基本单位,这一组操作,要么都执行,要么都不执行。(假如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败)
原子性A:事务中包含的各操作要么都做,要么都不做
一致性C:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
隔离性I:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性D:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
聊一聊并发事务带来的脏读、丢失修改、不可重复读、幻读?
脏读:脏读是指一个事务读取了另一个事务尚未提交(也有可能最终会被回滚)的数据。例如,事务A正在修改某个数据项,但还未提交,此时事务B读取了事务A修改但未提交的数据,如果事务A最后选择回滚,那么事务B读到的就是“脏”数据,即这部分数据实际上是无效的。
丢失修改:当两个事务同时修改同一数据项时,可能出现其中一个事务的更新被另一个事务覆盖的情况,导致数据的修改丢失。例如,事务A读取某一数值并加1,事务B也读取同一数值并加1,然后两个事务先后提交,最后数值只增加了1而不是预期的2,这就发生了丢失更新的问题。(加锁)
不可重复读: 在同一个事务内,对于同一份数据进行多次查询,结果却不同,这是因为在这两次查询之间,有其它的事务对这份数据进行了修改并提交。比如事务A第一次读取某行记录后,事务B对该行记录进行了修改并提交,事务A再次读取该记录时发现内容发生了变化,这就是不可重复读现象。
幻读: 幻读与不可重复读类似,但主要针对的是在同一个事务内多次执行相同的查询语句时,由于其它事务的插入操作导致结果集的新增或减少。比如事务A执行了一个范围查询并获取了结果集,之后事务B插入了一条新记录并且提交,在事务A再次执行同样的范围查询时,发现结果集中出现了新的记录,这种现象就是幻读。