Fork me on GitHub

MySQL 事务控制语言

TCL

/*
transaction control language 事务控制语言
事务
一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
特点
1,原子性(atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部发生,要么都不补发生。
2,一致性(consistency),
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3,隔离性(lsolation)
事务的隔离性是指一个事务的执行不受其他事务的干扰
4,持久性
一个事务一旦提交,则会永久的改变数据库的数据。
*/

SHOW ENGINES;
事务的创建
/*
隐式事务:事务没有明显的开启和结束的标记
比如 insert,update ,delete语句

显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit=0;关闭自动提交

步骤1:开启事务
set autocomit=0;
start transaction; 可选的
步骤2:编写事务中的SQL语句(select,insert update,delete)
语句1;
语句2;
,,,
步骤3:结束事务
commit;提交事务
rollback;回滚事务

savepoint:节点名,设置rollback的返回点

事务的隔离级别:
脏读 不可重复读 幻读
read uncommitted: √ √ √
rend committed: × √ √
repeatable read: × × √
serializable: × × ×

mysql中默认第三个隔离级别 repeatable read
oracle 中默认第二个隔离级别 read committed
查看当前的隔离级别: SELECT @@tx_isolation;
设置当前 mySQL 连接的隔离级别: set transaction isolation level read committed; 
设置数据库系统的全局的隔离级别: set global transaction isolation level read committed;

*/

演示事务的使用步骤
SET autocommit =0;
START TRANSACTION;
编写一组事务的语句
UPDATE account SET balance = 500 WHERE username='张无忌';
UPDATE account SET balance = 1500 WHERE username='赵敏';
结束事务
COMMIT;提交
ROLLBACK;回滚,二选一

如果同时运行多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
/*脏读:对于两个事务T1,T2,T1读取了已经被T2更新的但还没有被提交的字段,之后,若T2回滚,他读取的内容就是临时无效的
不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了
幻读:对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插 入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

数据库提供的 4 种事务隔离级别:
371bd09252bbb07c2bf3ebb95ac3ce19.png

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ
*/

posted @ 2020-04-23 16:17  话少  阅读(284)  评论(0编辑  收藏  举报