事务具有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特性内容请搜索靠谱客的其他文章。
发表评论 取消回复