数据库事务

    技术2025-10-25  11

    在数据库中,大家都知道会有事务的概念,那什么是事务呢?

    事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

    事务必须满足ACID4个属性。

    A 指的是原子性(Atomicity) 原子性是指 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 C 指的是一致性(Consistency) 一致性是指 事务必须使数据库从一个一致性状态变换到另一个一致性状态。 I 指的是隔离性(Isolation) 隔离性是指 一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能相互干扰 。与隔离级别有关 D是指持久性 持久性是指 一旦事务提交了,就无法回滚,它对数据库的改变是永久性的,接下来有异常或者其他操作不应该对其有任何影响。


    事务的隔离级别以及会产生的问题 事务的隔离级别有4个:4个级别由上到下 脏读,不可重复读,幻读等问题也逐渐解决 但是效率逐渐降低(因为锁) 1:读未提交(PostgreSQL没有这个级别) read-uncommitted ------>>可能发生 脏读 不可重复读,幻读 序列化异常等问题

    2: 读已提交 read-committed (oracle 和 postgreSQl 默认隔离级别)----->> 可能发生 不可重复读 序列化异常幻读等问题

    3: 可重复读(PostgreSQL的重复读不允许幻读) repeatable-read (MySql 默认隔离级别) ----->>可能发生 幻读 序列化异常

    如果两个事务同时进行更新 一个在更新 另一个需要等待 一个提交了 另一个可以更新但是提交会报错

    4: 串行事务/可序列化 serializable


    什么是脏读? 指读取到的数据是未提交的数据。例如有两个事务T1和T2,一个事务T1修改了数据,同时另一个事务T2读取了数据,可是第一个事务T1弄错了rollback回滚了,那么另一个事务T2读到的数据其实是无用的数据。 什么是不可重复读?主要对于update 指一个客户端在同一个事务中多次读取相同的数据而结果不一致。例如对于两个事务T1和T2,事务T1读取了一个字段后,T2在表中修改了数据且提交了,T1再次读取同一个字段,结果跟上次不一样。 什么是幻读?主要针对insert 指,一个事务T1对表进行查询 发现数据 id = 3不存在,这时候另一个事务T2操作了表 比如说添加了id=3数据并提交,这时候T1事务插入一条数据id=3 。发现主键冲突.再次查发现id=3已经存在 这就是幻读 什么是序列化异常? 成功提交一组事务的结果与一次运行这些事务的所有可能顺序不一致。

    Processed: 0.009, SQL: 9