1)原子性 事务是一个整体,不可拆分。要么整体成功,要么整体失败。
2)一致性 事务前后,数据库的状态满足所有的完整性约束。【状态守恒】
3)隔离性 多个并发事务相互独立、相互隔离、互不影响。【并发控制】
4)持久性 事务完成后, 结果需要持久化。【磁盘永久存储】
读未提交【非常不严谨的隔离级别、生产上禁止使用】
读已提交【Oracle 数据库默认的隔离级别】
可重复读【MySQL数据库默认的隔离级别】
串行化 【排队执行、读写互斥。最安全、性能最差】
select @@tx_isolation;
select @@global.tx_isolation;
MySQL 读未提交:
一个事务读取到了另一个事务没有提交的数据
MySQL 读已提交
一个事务只能读取另一个事务已经提交的数据【无法解决不可重复读的问题】
1) 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ committed;
SET SESSION TRANSACTION ISOLATION LEVEL READ committed;
2)查询隔离级别
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| READ-COMMITTED |
+-----------------------+
1 row in set (0.00 sec)
MySQL 可重复读:
在同一个事务中、多个相同的查询返回相同的结果
1)设置隔离级别
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
2)查看隔离级别
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ |
+-----------------------+
1 row in set (0.00 sec)
MySQL 串行化:
事务依次排队执行。性能非常差
1)设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2)查询隔离级别
mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| SERIALIZABLE |
+-----------------------+
1 row in set (0.00 sec)