事务ACID和事务的隔离级别

    xiaoxiao2025-04-17  22

    事务(ACID)★★★★★

    概念:事务是访问数据库的一个操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

    事务有四种特性

    1、原子性(Atomicity)

    即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。

    2、一致性(Consistency)

    事务的执行使得数据库从一种正确状态转换成另外一种正确状态。

    3、隔离性(Isolation)

    一个事务执行不能被其他事务干扰。即一个事务的内部操作及使用的数据,对其他并发事务是隔离的,并发事务互不干扰。

    4、持久性(Durability)

    事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存

    来段代码更进一步了解事务,执行sql语句时的事务的处理。作为程序员还是代码看的熟悉亲切啊

    try { stmt = conn.createStatement(); //关闭事务自动提交 conn.setAutoCommit(false); String sql1 ="update account set balance = balance-1000 where aid=1"; String sql2 ="update account set balance = balance+1000 where aid=2"; stmt.executeUpdate(sql1); stmt.executeUpdate(sql2); //提交事务 conn.commit(); } catch (SQLException e) { try { //如果出现sql语句执行异常事务回滚 conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); }

    并发下事务会产生的问题★★★★★

    多个事务的并发可能破坏事务的特性,会产生很多问题。总结一下主要就是四种:丢失修改、脏读、不可重复读、幻读。 下图是《数据库系统概论 第五版》王珊,书里面拍下来的,供大家更好的理解。

    1、丢失修改

    两事务T1、T2读入同一个数据并修改,T2提交的结果破坏了T1的提交结果,导致T1的修改被丢失。

    2、不可重复读

    事务T1读取数据后,事务T2对其数据进行了修改,然后T1再查看数据时发现与第一次读取的数据对不上。

    3、幻读 幻读是指事务T1读取数据库,事务T2对其数据进行插入部分或删除部分操作,事务T1再次读取事务时,蒙蔽的发现多了或少了一些数据。

    4.脏读 事务T1对某一数据进行修改然后写入到了硬盘,此时事务T2对该数据进行读取,由于某种原因,T1不想修改该数据了,便撤回了修改,数据库的数据恢复到原值。然而事务T2用的还是T1修改后的脏数据。

    简单的介绍了并发可能出现的几种情况,那么我们该怎样去解决这些并发故障呢? 下面提供了几种常见的并发控制技术。封锁,活锁,时间戳,乐观控制法,多版本控制法。

    事务的隔离级别★★

    事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。 mysql默认隔离级别是可重复度 Oracle、sql server 默认隔离级别是 读已提交

    最新回复(0)