赞
踩
事务具有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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。