天天看点

MySQL事务

一, 数据库事务处理

事务处理是将多个操作或者命令一起执行,所有命令全部成功执行才意味着该事务的成功,任何一个命令失败都意味着该事务的失败。

因此,事务处理是不是一荣俱荣,而是一毁全毁。

事务的四大特征(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';