外观
事务
概念
构成单一逻辑工作单元的操作集合称作事务(transaction),它是作为不可分割的逻辑单元执行的。
本质是一组SQL语句
连接、会话、事务
先建立连接在建立会话,最后开始事务
开始事务(commit/begin)
↓
事务内容
↓
提交事务(commit) 所作的操作不可撤回
事务的特性
ACID 原子性(Atomicity):事务中的所有操作要么都执行要么都不执行。 一致性(Consistency):事务将数据库是从一种一致状态转变为另一种一致状态。例:(转账时转账前后总余额不变) 隔离性(Isolation):一个事务的执行不应该受到其他事务的影响(彼此独立)。 持久性(Durability):一旦事务提交其结果为持久的(永久写入)。
事务的隔离
隔离级别
1 READ UNCOMMITTED(读未提交)
一个事务可以读取另一个未提交事务的数据。
2 READ COMMITTED(读提交)
只能读到已经提交了的内容
3 REPEATABLE READ(可重复读)
针对“不可重复读”这种情况而制定的隔离级别,可以有效的避免“不可重复读”。是MySQL的默认隔离级别。
4 SERIALIZABLE(序列化)
是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。这种级别下,“脏读”、“不可重复读”、“幻读”都可以被避免,但是执行效率奇差,性能开销也最大,所以基本没人会用。
查看隔离级别
select @@transaction_isolation;
例:
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
设置隔离级别
set [session|global] transaction isolation level [Read uncommitted|Read committed|Repeated Read|Serializable]
set @@session.transaction_isolation='Uncommitted-Read|Committed-Read|Repeated-Read|Serializable'
例:
mysql> -- 设置隔离级别为Read Committed
mysql> set session transaction isolation level Read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| READ-COMMITTED |
+-------------------------+
1 row in set (0.00 sec)
-- 设置read uncommitted级别:
set session transaction isolation level read uncommitted;
-- 设置read committed级别:
set session transaction isolation level read committed;
-- 设置repeatable read级别:
set session transaction isolation level repeatable read;
-- 设置serializable级别:
set session transaction isolation level serializable;
以上设置为临时设置,仅在本次会话有效。