一:事务(transaction)的概念与特性
事务是一系列操作,这些操作组成了一个逻辑工作单元。这个逻辑工作
单元中的操作作为一个整体,要么全部成功,要么全部失败。
事务的特性(ACID):
1.原子性(Atomicity):
事务中的一系列操作作为一个原子性的逻辑工作单元,这个逻辑工作
单元中的操作要么全部成功,要么全部失败。
2.一致性(Consistency):
事务操作之前与操作之后数据库系统的数据状态是从一种一致性状态
转换到另一种一致性状态。
3.隔离性(Isolation)
多个事务并发执行时,互相不能看到对方的操作过程。
4.持久性(Durability)
一旦事务执行成功,对数据库系统的影响是持久性的。
二:事务的隔离级别
事务的隔离级别有四个:
1. 读未提交(read uncommitted)
可能会发生脏读现象(读取了其他事务未提交的数据)、
不可重复读、幻读(两次读取的行数不一致)。
2. 读提交(read committed)
可能发生不可重复读、幻读(两次读取的行数不一致)。
3. 可重读级别(repeatable read)
MySQL默认隔离级别。注意:MySQL的InnoDB存储引擎已经解决了幻读问题。
4. 串行化级别(serializable)
隔离级别最高,甚至针对普通的查询操作都会加锁。
eg: select * from student; 执行该查询会默认加读锁(共享锁)。
三:读锁(共享锁)与写锁(排他锁)
读锁(共享锁):一个事务对某些数据加上了读锁,其他事务对这些数据也可以
加读锁;但是其他事务不能对这些数据加写锁。
写锁(排他锁):一个事务一旦对数据加上了写锁,则其他事务既不能对数据加
读锁,也不能加写锁。
一般情况下,不需要显式对数据加锁,因为DBMS会自动为我们添加锁。
添加读锁:
select 字段列表 from 表名称 lock in share mode;
还要注意:在事务的“串行化隔离级别中”,"select 字段列表 from 表名称"也会
自动加读锁。
添加写锁:
update、delete会自动添加写锁。
select 字段列表 from 表名称 for update;
事务是一系列操作,这些操作组成了一个逻辑工作单元。这个逻辑工作
单元中的操作作为一个整体,要么全部成功,要么全部失败。
事务的特性(ACID):
1.原子性(Atomicity):
事务中的一系列操作作为一个原子性的逻辑工作单元,这个逻辑工作
单元中的操作要么全部成功,要么全部失败。
2.一致性(Consistency):
事务操作之前与操作之后数据库系统的数据状态是从一种一致性状态
转换到另一种一致性状态。
3.隔离性(Isolation)
多个事务并发执行时,互相不能看到对方的操作过程。
4.持久性(Durability)
一旦事务执行成功,对数据库系统的影响是持久性的。
二:事务的隔离级别
事务的隔离级别有四个:
1. 读未提交(read uncommitted)
可能会发生脏读现象(读取了其他事务未提交的数据)、
不可重复读、幻读(两次读取的行数不一致)。
2. 读提交(read committed)
可能发生不可重复读、幻读(两次读取的行数不一致)。
3. 可重读级别(repeatable read)
MySQL默认隔离级别。注意:MySQL的InnoDB存储引擎已经解决了幻读问题。
4. 串行化级别(serializable)
隔离级别最高,甚至针对普通的查询操作都会加锁。
eg: select * from student; 执行该查询会默认加读锁(共享锁)。
三:读锁(共享锁)与写锁(排他锁)
读锁(共享锁):一个事务对某些数据加上了读锁,其他事务对这些数据也可以
加读锁;但是其他事务不能对这些数据加写锁。
写锁(排他锁):一个事务一旦对数据加上了写锁,则其他事务既不能对数据加
读锁,也不能加写锁。
一般情况下,不需要显式对数据加锁,因为DBMS会自动为我们添加锁。
添加读锁:
select 字段列表 from 表名称 lock in share mode;
还要注意:在事务的“串行化隔离级别中”,"select 字段列表 from 表名称"也会
自动加读锁。
添加写锁:
update、delete会自动添加写锁。
select 字段列表 from 表名称 for update;