在事务管理中:
mysql 默认的事务处理级别是 repeatable read
而 Oracle 和 SQL Server 是 read committed
show global variables like '%isolation%';
SELECT @@global.tx_isolation;
show session variables like '%isolation%';
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
select @@global.tx_isolation;
set global transaction isolation level read committed;
select @@global.tx_isolation;
select @@tx_isolation;
set session transaction isolation level read committed;
select @@tx_isolation;
MySQL 中使用命令控制事务需要用到以下命令:
BEGIN 或 START TRANSACTION:显式地开启一个事务
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点
创建数据库与数据表,用作实例
create database school;
#创建数据库
use school;
#进入数据库
create table class (id int(10) primary key not null,name varchar(40),money double);
#创建数据表
#字段一(10):主键,且不能为空值
#字段二(40)可变长度字段
#字段三:浮点类型
insert into class values(1,'A',1000);
insert into class values(2,'B',1000);
#在表中插入新数据记录
select * from class;
#查看class数据表
begin;
#开启事务
update class set money = money - 100 where name = 'A';
#更新表字段,name字段=A的money值 - 100
select * from CLASS;
#查看表
commit;
#提交事务
quit
#退出
mysql -uroot -p123123
use school;
select * from class;
#重新登录,再次查看
begin;
update class set money = money + 100 where name = 'A';
select * from CLASS;
rollback;
#回滚,结束事务,并撤销正在进行的所有未提交的修改
quit
mysql -uroot -p123123
use school;
select * from class;
begin;
#再次开启一个事务
update class set money = money + 100 where name = 'A';
#更新表中A的money值+100
select * from class;
SAVEPOINT S1;
#创建回滚点S1
update class set money= money + 100 where name = 'B';
#更新表B中的money值+100
select * from CLASS;
SAVEPOINT S2;
#创建回滚段S2
insert into class values(3,'C',1000);
#再次插入一条数据记录
select * from CLASS;
ROLLBACK TO S1;
#回滚到回滚点S1
select * from CLASS;
SET AUTOCOMMIT=0; #禁止自动提交
SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1
SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值
#如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
#如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。
#当然无论开启与否,begin; commit|rollback; 都是独立的事务
实例如下:
use school;
select * from class;
SET AUTOCOMMIT=0;
#设置禁止自动提交,不使用commit提交操作语句
#和使用begin的情况相同,执行的语句都会失效
SHOW VARIABLES LIKE 'AUTOCOMMIT';
#查看值
update class set money = money + 100 where name = 'B';
#更新表数据
select * from class;
quit
mysql -uroot -p123123
use school;
select * from class;