数据库事务: 是组成单一逻辑工作单元的操作集合。
一、事务的特性
事务的四个特性:ACID
1、原子性(atomicity):指处于同一个事务中的多条语句要么全部提交,要么全部失败回滚。
2、一致性(consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为100,转账之后也应该是100。
3、隔离性(isolation):指多个事务之间互不干扰。
4、持久性(durability):事务一旦提交,就应该被永久保存起来。
二、事务隔离级别
如果不考虑事务的隔离性,会出现以下问题:
脏读:指一个事务中读取到了另外一个事务中未提交的数据。
不可重复读(虚读):指一个事务读取到了另外一个事务中提交后的更改数据(这里的读取就是指的select读取,即两次相同的查询)
幻读:指一个事务“读取”到了另外一个事务中提交后的更改数据(这里的读取指的是通过更改读取,即一次查询发现数据正常,然后再对数据修改却报错,感觉自己第一次读取的数据有问题了)。
几种隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
| 已提交读(Read committed) | 不可能 | 可能 | 可能 |
| 可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
| 可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
从上到下,级别越高,数据越安全,但性能越低,并发越低。
不同的隔离级别是在数据可靠性和并发性之间的均衡取舍。
注: 不可重复读、幻读与脏读的区别在于,脏读是在一个事务中读到了另一个事务未提交的数据;不可重复读与幻读是在一个事务中读到了另一个事务提交的数据。
而不可重复读与幻读的区别在于,不可重复读是指在一个事务中多次读的某条数据不一致(重点在update),幻读是指在一个事务中多次读的数据个数不一样(重点在insert、delete)
三、查看并修改数据库隔离级别
1、查询数据库隔离级别
会话级:
mysql> SELECT @@tx_isolation;
±----------------+
| @@tx_isolation |
±----------------+
| REPEATABLE-READ |
±----------------+
1 row in set, 1 warning (0.00 sec)
数据库级:
mysql> select @@global.tx_isolation;
±----------------------+
| @@global.tx_isolation |
±----------------------+
| REPEATABLE-READ |
±----------------------+
1 row in set, 1 warning (0.00 sec)
参数级:
mysql> show variables like ‘%isolation%’;
±----------------------±----------------+
| Variable_name | Value |
±----------------------±----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation | REPEATABLE-READ |
±----------------------±----------------+
2 rows in set (0.00 sec)
2、修改数据库隔离级别
语法:
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
会话级:
set session transaction isolation level repeatable read;
数据库级:
set global transaction isolation level repeatable read;
参数级:
vim /etc/my.cnf
transaction-isolation = READ-COMMITTED
注:如果想永久生效,就在参数文件中修改,数据库重启后也不会变。




