当前位置 博文首页 > 韩超的博客 (hanchao5272):MySql: 事务特性ACID、三大并发读、
原子性:
rollback
到事务开始前的状态。一致性:事务执行完成之后,数据应该满足完整性约束。
举例:事务执行前A、B的存款都是100,事务内容是A转账B,则事务执行完成之后,需要满足A和B的存款和还是200。
隔离性:不用的事务之间互不干扰。
隔离级别:关于数据的隔离性,MySql提供了四种级别,后文详细说明。
持久性:事务一旦提交,则对数据库中数据的改变会是永久性的,即便数据库系统遇到故障也不会丢失。
如果不对事务进行隔离性的保障,则在多个事务并发进行时,可能出现:脏读、不可重复读、幻读。
脏读:一个事务处理过程中,读取了另一个事务还未提交的数据。
举例:
还未提交
。money = money + 100
,将money修改为200。重点:针对还未提交
的数据。
不可重复读:一个事务处理过程中,对同一数据的多次查询得到不同的结果,这是由于另一个事务在多次查询间隔修改了这个数据。
举例:
提交
。重点:针对被修改
且已提交
的数据。
幻读:一个事务处理过程中,读取了另一个事务新增加
或删除
的数据。
举例:
提交
。重点:针对新增删
且已提交
数据。
MySql提供了四种事务隔离级别,从低到高依次是:读未提交、度已提交、可重复度、串行化。
Read
到其他事务未提交Uncommitted
的数据。Committed
的数据。已提交
的保证,能够避免脏读的出现。Repeatable
读取Read
,多次读取结果一致。默认事务隔离级别
。Serializable
的方式运行,自然不会产生并发事务问题。隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 未解决 | 未解决 | 未解决 |
读已提交 | 解决 | 未解决 | 未解决 |
可重复读 | 解决 | 解决 | 未解决 |
串行化 | 解决 | 解决 | 解决 |
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.03 sec)
mysql> set tx_isolation='read-committed';
Query OK, 0 rows affected (0.01 sec)
mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set (0.01 sec)
注意:在开启事务之前,设置事务隔离级别。
//获取连接
Connection conn = getConnect();
//设置事务隔离级别
conn.setTrasactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
//开启事务
conn.setAutoCommit(false);
cs