一, 数据库事务处理
事务处理是将多个操作或者命令一起执行,所有命令全部成功执行才意味着该事务的成功,任何一个命令失败都意味着该事务的失败。
因此,事务处理是不是一荣俱荣,而是一毁全毁。
事务的四大特征(ACID)
- 原子性(A):事务是最小的单位,不可再分
- 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者失败
- 隔离性( I ):事务A与事务B之间具有隔离性
- 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
二,事务语句
● BEGIN | Start Transaction:开启事务
● SAVEPOINT 标识名称:保留点,每个保留点都表示它的唯一名字,以便以后回退。在MySQL事务中保留点越多越好,这样能够按照自己的意愿灵活的进行回退。
● ROLLBACK 保留点标识:回滚到指定保留点处
● ROLLBACK:事务回滚,整个事务回滚
● COMMIT;提交事务,COMMIT提交或ROLLBACK回滚后会关闭事务。
● SET AUTOCOMMIT = { 0 | 1 };设置事务自动提交,1自动,0取消自动
● 查询自动提交功能状态:SELECT @@AUTOCOMMIT;
事务使用:
BEGIN;#开启事务
MDL语句;#事务失败
ROLLBACK;#事务回滚
--------------------------------------------
BEGIN;#开启事务
MDL语句;#事务成功
COMMIT;#事务提交
三,隔离性-隔离级别
事务A与事务B之间具有一定的隔离性
隔离级别 | 非提交读取(脏读) | 不可重复读取 | 幻想读 |
READ UNCOMMITED 读未提交 | ✔ | ||
READ COMMITED 读已提交 | ✖ | ||
REPEATABLE READ 可重复读 | |||
SERIALIZABLE 串行化 |
1)读未提交:Read Uncommitted
- 事物A和事物B,事物A未提交的数据,事物B可以读取到
- 这里读取到的数据叫做“脏数据”
- 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别
2)读已提交:Read Committed
- 事物A和事物B,事物A提交的数据,事物B才能读取到 - 这种隔离级别高于读未提交
- 换句话说,对方事物提交之后的数据,我当前事物才能读取到
- 这种级别可以避免“脏数据”
- 这种隔离级别会导致“不可重复读取”
- Oracle默认隔离级别
3)可重复读:Repeatable Read
- 事务A和事务B,事务A提交之后的数据,事务B读取不到
- 事务B是可重复读取数据
- 这种隔离级别高于读已提交
- 换句话说,对方提交之后的数据,我还是读取不到
- 这种隔离级别可以避免“不可重复读取”,达到可重复读取
- 比如1点和2点读到数据是同一个
- MySQL默认级别
- 虽然可以达到可重复读取,但是会导致“幻像读”
4)串行化:Serializable
- 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
- 这种隔离级别很少使用,吞吐量太低,用户体验差
- 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
设置隔离级别:
- 方法一:在my.ini文件中使用transaction-isolation选项来设置事务服务器的省缺事务隔离级别,例:transaction-isolation = READ-COMMITTED
- 方法二:通过动态命令设置隔离级别,在运行的服务器中动态设置;SET [ GLOBAL | SESSION ] TRANSACTION ISOLATION LEVEL 隔离级别;
- 隔离级别的作用范围:
- GLOBAL:全局级,对所有会话有效;SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
- SESSION:会话级,只对当前会话有效;SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
查看隔离级别:SHOW VARIABLES LIKE 'tx_isolation';