我是靠谱客的博主 天真煎蛋,这篇文章主要介绍事务ACID特性;脏读、不可重复读、幻读;读未提交、读已提交、可重复读、串行化,现在分享给大家,希望可以做个参考。

事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性。

事务的操作会在临时表中进行,全部操作结束后,如果有数据变更,提交数据变更到数据库中,进行持久保存。

一、原子性(atomicity)

事务必须全部提交成功,或者有失败时回滚。

二、一致性(consistency)

事务执行前后,数据库的状态是一致的。如:5个账户共有500万,执行多个相互转账的事务后,5个账户仍共有500万。

三、隔离性(isolation)

事务之间互不干扰。

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同,分别是:读未提交,读已提交,可重复读和串行化。隔离等级越来越高。

脏读(dirty reads):一个事务读取了另一个事务未提交的数据。这个数据有可能回滚。(A读时,B写)

不可重复读(non-repeatable reads):一个事务范围内,两个相同的查询,由于另一个事务对数据的修改,返回了不同的数据。(A读与读中,B写)

幻读(phantom reads):一个事务修改了符合条件的数据,同时另一个事务插入了符合条件的数据行。前者在读的时候会发现符合条件的数据行未被全部修改。(A写时B写,后A读)

1、读未提交(Read Uncommited):一个事务可以读另一个事务未提交的数据。不能防止脏读、不可重复读、幻读。(A读时,B写)

2、读已提交(Read Commited):一个事务在另一个事务写数据时想读相同的数据,必须等那个事务提交后。防止脏读,不能防止不可重复读、幻读。(A读时,B不能写)

3、可重复读(Repeatable Read):一个事务范围内,两个相同的查询能返回相同的数据,不会被另一个事务修改数据。防止脏读,不可重复读,不能防止幻读。(A读与读中,B不能写)

4、串行化(Serializable):事务串行。防止脏读、不可重复读、幻读。

四、持久性(durability)

一旦事务提交成功,事务对数据库的变更永久保存。

java.sql.Connection源码中的事务隔离等级翻译:

    /**
     * 表示不支持事务的常量。
     */
    int TRANSACTION_NONE             = 0;

/ * *
表示
*可能会发生脏读、不可重复读和幻像读。
*这个级别允许读取由一个事务更改的行
*在该行的任何更改之前被另一个事务处理
*承诺(“肮脏的阅读”)。如果任何更改被回滚,
*第二个事务将检索到无效的行。
* /
    int TRANSACTION_READ_UNCOMMITTED = 1;

/ * *
表示
*防止脏读;不可重复读和幻像
*可能会发生读取。此级别仅禁止事务
*从读取包含未提交更改的行。
* /
    int TRANSACTION_READ_COMMITTED   = 2;

/ * *
表示
*防止脏读和不可重复读;幻影
*可能会发生读取。此级别禁止事务
*读取一行未提交的更改,它也
*禁止一个事务读取一行,
第二个事务改变行,第一个事务改变行
*重新读取行,第二次获得不同的值
*(“不可重复读取”)。
* /
    int TRANSACTION_REPEATABLE_READ  = 4;

/ * *
表示
*防止脏读、不可重复读和幻像读。
*此级别包括禁止
* <code>TRANSACTION_REPEATABLE_READ</code>,进一步禁止
*一个事务读取满足条件的所有行
* a <code>其中</code>条件,第二个事务插入一行,该行
*满足<code>其中</code>条件,和第一个事务
*重读相同的条件,检索附加的
*第二次读取中的“幻影”行。
* /
    int TRANSACTION_SERIALIZABLE     = 8;

    /**
*尝试为此更改事务隔离级别
* <code>Connection</code>对象到给定的对象。
*接口<code>Connection</code>中定义的常量
*是可能的事务隔离级别。
     * <P>
     * <B>Note:</B> If this method is called during a transaction, the result
     * is implementation-defined.
     *
     * @param level one of the following <code>Connection</code> constants:
     *        <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
     *        <code>Connection.TRANSACTION_READ_COMMITTED</code>,
     *        <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
     *        <code>Connection.TRANSACTION_SERIALIZABLE</code>.
     *        (Note that <code>Connection.TRANSACTION_NONE</code> cannot be used
     *        because it specifies that transactions are not supported.)
     * @exception SQLException if a database access error occurs, this
     * method is called on a closed connection
     *            or the given parameter is not one of the <code>Connection</code>
     *            constants
     * @see DatabaseMetaData#supportsTransactionIsolationLevel
     * @see #getTransactionIsolation
     */
    void setTransactionIsolation(int level) throws SQLException;

 

最后

以上就是天真煎蛋最近收集整理的关于事务ACID特性;脏读、不可重复读、幻读;读未提交、读已提交、可重复读、串行化的全部内容,更多相关事务ACID特性内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(128)

评论列表共有 0 条评论

立即
投稿
返回
顶部