mysql事务控制语言(TCL)

事务:

概念:

一个或一组SQL语句组成的执行单元,执行单元所有SQL语句要么全执行,要么全不执行。

栗子:
张三给李四转账。
张三:账户1000元。      李四:账户1000元。
update 表 set '张三账户' = 500 where name = '张三';
数据库中途异常...
update 表 set '李四账户' = 1500 where name = '李四';
(两条语句组成一个执行单元,中途如果出现意外,结果显然不是想要的。)

每条语句相互依赖,作为一个不可分割的整体,如果发生意外回滚至最初状态。

事务的特点:

①. 原子性: 事务是不可分割的一个单位,事务中操作要么都执行,要么都不执行。
②. 一致性: 事务必须从一个一致性状态到另一个一致性状态。
(转账栗子中转账前是2000元,转账后依然是2000元。)
③. 隔离性: 一个事务执行不被另一个事务干扰。(隔离级别控制)
④. 持久性: 一个事务一旦被提交,对数据库数据是永久性的。
(删除操作,无法恢复,只能重新创建。)

事务的创建和分类:

①.隐式事务:

事务没有明显开启结束标记。
(如:insert、update、delete语句。autocommit自动提交默认开启状态。)

②.显式事务:

事务具有明显开启结束标记。
(设置自动提交为off ,只对当前事务有效)。
栗子:

    ⒈设置自动提交状态。
      set autocommit = 0;
    ⒉编写需要的SQL语句。
      (select、delete、update、insert)
    ⒊结束事务。
      commit;(提交事务) 或 rollback;(回滚事务)

隔离:

事务并发:

同时运行的多个事务,当这些事务访问数据库相同数据时,
如果没有采用隔离机制,就会出现并发问题。

出现的问题:

①. 脏读: 事务1对数据库数据进行更新,但没有提交,
事务2读取相同数据,此时如果事务1回滚,事务2读取的数据就是临时且无效的数据。
②. 不可重复读: 事务1读取数据库数据之后,没有提交,
此时事务2对相同数据进行更新,事务1再次读取数据时数据变了。
③. 幻读: 事务1读取数据库数据之后,没有提交,
此时事务2插入新的数据,事务1再次读取数据时多出一些数据。

事务的隔离级别:

①. read uncommitted : 脏读,不可重复读,幻读都会出现。
②. read committed : 避免脏读,会出现不可重复读和幻读。
③. repeatable read : 避免脏读和不可重复读,会出现幻读。
④. serializable : 都会避免。

命令:

⒈查看隔离级别:
 select tx_@@isolation;
⒉设置隔离级别:
 set session/global transaction isolation level 隔离级别;

MySQL默认第三种隔离级别,Oracle默认第二种。


版权声明:本文为m0_46162184原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。