当前位置:   article > 正文

事务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源码中的事务隔离等级翻译:

  1. /**
  2. * 表示不支持事务的常量。
  3. */
  4. int TRANSACTION_NONE = 0;
  5. / * *
  6. 表示
  7. *可能会发生脏读、不可重复读和幻像读。
  8. *这个级别允许读取由一个事务更改的行
  9. *在该行的任何更改之前被另一个事务处理
  10. *承诺(“肮脏的阅读”)。如果任何更改被回滚,
  11. *第二个事务将检索到无效的行。
  12. * /
  13. int TRANSACTION_READ_UNCOMMITTED = 1;
  14. / * *
  15. 表示
  16. *防止脏读;不可重复读和幻像
  17. *可能会发生读取。此级别仅禁止事务
  18. *从读取包含未提交更改的行。
  19. * /
  20. int TRANSACTION_READ_COMMITTED = 2;
  21. / * *
  22. 表示
  23. *防止脏读和不可重复读;幻影
  24. *可能会发生读取。此级别禁止事务
  25. *读取一行未提交的更改,它也
  26. *禁止一个事务读取一行,
  27. 第二个事务改变行,第一个事务改变行
  28. *重新读取行,第二次获得不同的值
  29. *(“不可重复读取”)。
  30. * /
  31. int TRANSACTION_REPEATABLE_READ = 4;
  32. / * *
  33. 表示
  34. *防止脏读、不可重复读和幻像读。
  35. *此级别包括禁止
  36. * <code>TRANSACTION_REPEATABLE_READ</code>,进一步禁止
  37. *一个事务读取满足条件的所有行
  38. * a <code>其中</code>条件,第二个事务插入一行,该行
  39. *满足<code>其中</code>条件,和第一个事务
  40. *重读相同的条件,检索附加的
  41. *第二次读取中的“幻影”行。
  42. * /
  43. int TRANSACTION_SERIALIZABLE = 8;
  44. /**
  45. *尝试为此更改事务隔离级别
  46. * <code>Connection</code>对象到给定的对象。
  47. *接口<code>Connection</code>中定义的常量
  48. *是可能的事务隔离级别。
  49. * <P>
  50. * <B>Note:</B> If this method is called during a transaction, the result
  51. * is implementation-defined.
  52. *
  53. * @param level one of the following <code>Connection</code> constants:
  54. * <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
  55. * <code>Connection.TRANSACTION_READ_COMMITTED</code>,
  56. * <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
  57. * <code>Connection.TRANSACTION_SERIALIZABLE</code>.
  58. * (Note that <code>Connection.TRANSACTION_NONE</code> cannot be used
  59. * because it specifies that transactions are not supported.)
  60. * @exception SQLException if a database access error occurs, this
  61. * method is called on a closed connection
  62. * or the given parameter is not one of the <code>Connection</code>
  63. * constants
  64. * @see DatabaseMetaData#supportsTransactionIsolationLevel
  65. * @see #getTransactionIsolation
  66. */
  67. void setTransactionIsolation(int level) throws SQLException;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/239551
推荐阅读
相关标签
  

闽ICP备14008679号