MySql的复习(八):事务
事务可以保证多个操作原子性,要么全部成功,要么全部失败。
事物的一些特性
四个特征
-
原子性(Atomicity):
整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)
-
一致性(Consistency)
在事务开始之前与结束之后,数据库都保持一致状态
-
隔离性(Isolation)
一个事务不会影响其他事务的运行
-
持久性(Durability)
l 在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
一些概念
当执行DML语句是其实就是开启一个事务
关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚.
事务只对DML有效果。
注意:rollback,或者commit后事务就结束了。
事务的提交和回滚演示
mysql事务默认情况下是自动提交的。
就是只要执行任意一条DML语句则提交一次。关闭默认提交---->start transaction;
- 创建表
create table user(
id int (11) primary key not null auto_increment ,
username varchar(30),
password varchar(30)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 查询表数据
select * from user;
- 开启事务
start transaction;
- 插入数据
insert into user (username,password) values ('zhangsan','123');
- 查看数据
select * from user;
- 修改数据
update user set username = 'lisa' where id = 1;
- 查看数据
select * from user;
- 回滚事务
rollback;
- 查看数据
自动提交模式
-
自动提交莫斯决定新事务如何及何时启动。
-
启动自动提交模式
– 如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。
– 如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。
– 如果语句执行失败,事务将自动回滚,并取消该语句的结果。
– 在自动提交模式下,仍可使用START TRANSACTION语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。
-
禁用自动提交模式:
– 如果禁用自动提交,事务可以跨越多条语句。
– 在这种情况下,事务可以用COMMIT和ROLLBACK语句来显式地提交或回滚。
-
自动提交模式可以通过服务器变量AUTOCOMMIT来控制。
-- 例如:
mysql> SET AUTOCOMMIT = OFF;
mysql> SET AUTOCOMMIT = ON;
-- 或
mysql> SET SESSION AUTOCOMMIT = OFF;
mysql> SET SESSION AUTOCOMMIT = ON;
show variables like '%auto%'; -- 查看变量状态
事务的隔离级别
四个隔离级别
事务的隔壁性存在隔离级别,理论上隔离级别包括4个:
-
第一级别:读未提交(read uncommitted)
对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
读未提交存在脏读(Dirty Read) 现象:表示读到了脏数据。
-
读已提交(read committed)
对方事务提交之后的数据我方可以读取到。
读已提交存在的问题是:不可重复读。 -
可重复读(repeatable read)
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。 -
序列化读/串行化读
解决了所有问题。
效率低,需要事务排队。Oracle数据库默认的隔离级别是:第二级别,读已提交。 mysql数据库默认的隔离级别是:第三级别,可重复读。
隔离级别和一致性的问题
演示两个事务
假如隔离级别:
演示第一级别:读未提交
set global transaction isolation level read uncommitted;
演示第二级别;读已提交
set global transaction isolation level read committed;
演示第三级别:可重复读
set global transaction isolation level repeatable read;