1.事务处理
1.事务的概念
事务是针对数据库的一组操作, 它可以由-一条或多条SQL语句组成。
2.事务的基本操作
在默认情况下,用户执行的每一条SQL语句都会被当成单独的事务自动提交。
如果要将一组SQL 语句作为-一个事务, 则需要先执行以下语句显式地开启一个事务。
START TRANSACTION;
此时,每一条SQL语句不再自动提交,用户需要手动提交操作才会生效。
COMMIT;
如果不想提交当前事务,可以取消事务(即回滚)。
ROLLBACK;
事务的执行要么成功,要么就返回到事务开始前的状态,这就保证了同一事务操作的同步性和数据的完整性。
MySQL中的事务必须满足A、C、I、D这4个基本特性。
- Atomicity: 原子性
一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功。
- Consistency:一致性
一致性是指在事务处理时,无论执行成功还是失败,都要保证数据库系统处于一致的状态,保证数据库系统从不返回到一个未处理的事务中。
- Isolation: 隔离性
隔离性是指当一个事务在执行时,不会受到其他事务的影响。保证了未完成事务的所有操作与数据库系统的隔离,直到事务完成为止,才能看到事务的执行结果。
- Durability: 持久性
持久性是指事务一旦提交, 其对数据库的修改就是永久性的。
3.事务的保存点
在回滚事务时,若希望只撤销一部分,可以用保存点来实现。
SAVEPOINT 保存点名;
在设置保存点后,可以将事务回滚到指定保存点。
ROLLBACK TO SAVEPOINT 保存点名;
若不再需要一个保存点,使用如下语句删除。
RELEASE SAVEPOINT保存点名;
一个事务中可以创建多个保存点,在提交事务后,事务中的保存点就会被删除。
在回滚到某个保存点后,在该保存点之后创建过的保存点也会消失。
2.事务的隔离级别
事务隔离级的意义:
数据库是一个多用户的共享资源,MySQL允许多线程并发访问,用户可以通过不同的线程执行不同的事务。
为了保证这些事务之间不受影响,对事务设置隔离级是十分必要的。
1.查看事务隔离级别
#查看全局隔离级
SELECT @@global.transaction_ _isolation;
#查看当前会话中的隔离级
SELECT @@session.transaction_ isolation;
#查看下一个事务的隔离级
SELECT @@transaction_ isolation;
全局的隔离级:影响所有连接MySQL用户。
当前会话隔离级:只影响当前正在登录MySQL服务器的用户。(不会影响其他用户)
下一个事务的隔离级:仅对当前用户的下一个事务操作有影响。
MySQL中事务的隔离级别:
- REPEATABLE READ:可重复读
MySQL的默认事务隔离级,它解决了脏读和不可重复读的问题,
确保了同一事务的多个实例在并发读取数据时,会看到同样的结果。
- READ UNCOMMITTED:读取未提交
事务中最低的级别,可以读取到其他事务中未提交的数据。
也称为脏读(Dirty Read) :一个事务读取了另外一个事务未提交的数据。
- READ COMMITTED:读取提交
大多数DBMS (如SQL Server、Oracle) 的默认隔离级,但不包括MySQL。
只能读取其他事务已经提交的数据,避免了脏读问题。
但是会出现不可重复读(NON-REPEATABLE READ)问题。
- SERIALIZABLE:可串行化
隔离级的最高级别,它在每个读的数据行上加锁,使之不会发生冲突,解决了脏读、不可重复读和幻读的问题。
由于加锁可能导致超时(Timeout) 和锁竞争(Lock Contention)现象,性能是4种隔离级中最低的。
除非为了数据的稳定性,需要强制减少并发的情况时,才会选择此种隔离级。
2.修改隔离级别
设置事务的隔离级别:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL 参数值
- SESSION: 当前会话
- GLOBAL:全局
- 直接省略:下一个事务的隔离级
- TRANSACTION:事务
- ISOLATION:隔离
- LEVEL: 级别