tcl是事务控制语言
事务的特点(ACID)
- 原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现);
- 一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务);
- 隔离性:多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现);
- 持久性:一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的)
事务的分类
隐式事务:事务没有明显的开启和结束标志。可以自动提交。比如:insert 、update 、delete语句。
显式事务:事务有明显的开启和结束标志。前提是必须先设置自动提交功能为禁用。
set autocommit=0;
只针对当前事务有效
事务的创建
步骤1:开启事务
set autocommit=0;
start transaction;(可选)
步骤2:编写事务中的sql语句(select insert update delete)。dbl语言没有事务
步骤3:结束事务
commit; #提交事务
rollback; #回滚事务
事务的并发问题
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题
- read uncommtted(读未提交数据):允许事务读取未被其他事务提交的更改。脏读、不可重复读(在另一事务提交前后查询到的内容不同)和幻读(针对插入和删除)的问题都会出现
- read commted(读已提交数据):只允许事务读取已经被其他事务提交的更改。只可以避免脏读
- repeatable read(可重复度)(mysql默认):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新。可以避免脏读和不可重复读
- serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作。可以解决所有并发问题,但性能低下
查看当前的隔离级别
select @ @tx_isolation
设置当前mysql连接的隔离级别
set (session )transaction isolation level 隔离级别
设置数据库系统的全局的隔离级别
set global (session )transaction isolation level 隔离级别
delete和truncate在事务使用时的区别
delete可以回滚,truncate不可以
保存点
savepoint 名;#设置保存点
rollback to 名; #回滚到保存点