mysql的事务

一、事务定义

  • Transaction
  • 事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
  • 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
  • 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同

  转账操作理解事务

关于银行账户转账操作,账户转账是一个完整的业务,最小的单元,不可再分—————也就是说银行账户转账是一个事务。

以下是银行账户表t_act(账号、余额),进行转账操作

update t_act set balance=400 where actno=1;

update t_act set balance=200 where actno=2;

以上两台DML语句必须同时成功或者同时失败。最小单元不可再分,当第一条DML语句执行成功后,并不能将底层数据库中的第一个账户的数据修改,只是将操作记录了一下;这个记录是在内存中完成的;当第二条DML语句执行成功后,和底层数据库文件中的数据完成同步。若第二条DML语句执行失败,则清空所有的历史操作记录,要完成以上的功能必须借助事务

二、事务四大特征(ACID)

  • 原子性(A):事务是最小单位,不可再分
  • 一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
  • 隔离性(I):事务A和事务B之间具有隔离性
  • 持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

三、关于事务的一些术语

  • 开启事务:Start Transaction
  • 事务结束:End Transaction
  • 提交事务:Commit Transaction
  • 回滚事务:Rollback Transaction

四、事务四大特性之一————隔离性(isolation)

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选项来设置服务器的缺省事务隔离级别。

  该选项值可以是:

  

READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE

•   例如:
[mysqld]
transaction-isolation = READ-COMMITTED

 

方式二

通过命令动态设置隔离级别

  • 隔离级别也可以在运行的服务器中动态设置,应使用SET TRANSACTION ISOLATION LEVEL语句。

  其语法模式为:

   SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
        其中的<isolation-level>可以是:
    –   READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE
    •   例如: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

 

posted @ 2020-10-28 09:42  随心的风  阅读(96)  评论(0编辑  收藏  举报