数据库MySQL-TCL事务控制语言
TCL
transaction control language 事务控制语言
事务:
一个或一组sql 语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的ACID( acid) 属性
1 、原子性( Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2 、一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3 、隔离性( Isolation )
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用
的数据对并发的其他事务是隔离的,并发执行的各个事物之间不能互相干扰。
4 、持久性(durability)
持久性是指一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来的其他操作
和数据库故障不应该对其有任何影响。
事务的创建:
1 、隐式事务:事务没有明显的开启和结束的标记
比如:insert 、update 、delete 语句。
2 、显示事务:事务具有明显的开启和结束的标记
前提:必须先设置自动提交功能为禁用。
set autocommit = 0 ;
show variables like 'autocommit' ;
步骤1 :开启事务
set autocommit= 0 ;
start transaction ; 可选的
步骤2 :编写事务中的sql 语句( select insert update delete )
语句1 ,语句2 ,. . .
步骤3 :结束事务
commit ; 提交事务
rollback ; 回滚
savepoint :保存回滚点
事务并发引发的问题:
1 、脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有提交的字段,
之后,若T2回滚,T1读取的内容就是临时且无效的。
2 、不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,
之后,T1再次读取同一个字段,值就不同了。
3 、幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中
插入了一些新的行之后,如果T1再次读取同一个表,就会多出几行。
隔离级别:
脏读 不可重复读 幻读
read uncommitted 是 是 是
read committed 否 是 是
repeatable read 否 否 是
serializable 否 否 否
mysql中默认第三个隔离级别:repeatable read
oracle中默认第二个隔离级别:read committed
查看当前的隔离级别:select @@tx_isolation ;
设置当前mySQL连接的隔离级别:
set transaction isolation level resd committed ;
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed ;
* /
ALTER TABLE beauty MODIFY COLUMN account DOUBLE DEFAULT 1000.0 ;
SELECT * FROM beauty;
DESC beauty;
SET autocommit= 0 ;
START TRANSACTION ;
UPDATE beauty SET account= 1500 WHERE NAME= '刘涛' ;
UPDATE beauty SET account= 500 WHERE NAME= '宋茜' ;
COMMIT
SET autocommit = 0 ;
START TRANSACTION ;
DELETE FROM beauty WHERE id = '54' ;
SAVEPOINT a;
DELETE FROM beauty WHERE id = '120' ;
ROLLBACK TO a;
• delete 删除支持回滚,truncate 不支持回滚。