数据库事务介绍(二)如何使用事务

写在前面:事务的相关操作都是以mysql8.0为例。

目录

如何使用事务

显式事务

步骤1:

步骤2:

步骤3:

隐式事务

数据定义语言(DDL)

隐式使用或修改mysql数据库中的表

事务控制或关于锁定的语句

 加载数据的语句

关于mysql复制的一些语句

其他一些语句


如何使用事务

使用事务有两种方式,分别为显式事务和隐式事务。

显式事务

步骤1:

start transaction或begin,作用是显式开启一个事务。

start transaction语句相较于begin特别之处在于后面能跟随几个修饰符:

①read only,表示当前事务是一个只读事务,也就是属于该事物的数据库操作只能读取数据而不能修改数据。

补充:只读事务中只是不允许修改那些其他事务也能访问到的数据表中的数据,而对于临时表
来说(我们使用create temporary table创建的表),由于他们只能在当前会话中可见,所以
只读事务是可以对临时表进行增删改操作的。

②read write,表示当前事务是一个读写事务,也就是属于该事物的数据库操作既可以读取数据,也可以修改数据。

③with consistent snapshot ,启动一致性读。

比如:

数据库事务介绍(二)如何使用事务_第1张图片

注意:
read only和read write是用来设置所谓的事务访问模式的,就是以只读还是读写方式来访问
数据库中的数据,一个事务的访问博士不能同时设置为只读和读写,所以不能同时把read only和
read write放到start transaction语句后边。

如果我们不是显式指定事务访问模式,那么该事务的访问模式就是读写模式。

步骤2

一系列事务中的操作(主要是DML操作,不含DDL)。

步骤3:

提交事务或中止事务(即回滚事务)。

#提交事务。当提交事务后,对数据库的修改是永久性的。
commit;
#回滚事务,即撤销正在进行的所有没有提交的修改
rollback;
#将事务回滚到某个保存点
rollback to【savepoint】

其中关于savepoint相关操作有
#在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点
savepoint 保存点名;
#删除某个保存点
release savepoint 保存点名称;

默认情况下如果我们不显式地使用start transaction或者begin语句开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为自动提交。也就是说,不以start transaction或begin语句显式开启一个事务,那么下面的两条语句就相当于放到两个独立的事务中去执行:

update account set balance = balance - 10 where id = 1;

update account set balance = balance + 10 where id = 2;

当然,如果我们想关闭这种自动提交功能,可以使用下面两种方式之一:

①显式的使用start  transaction或begin语句开启一个事务。这样在本次事务提交或者回滚前会暂时关闭掉自动提交的功能。

②把系统变量autocommit的值设置为off。

默认其值为on

数据库事务介绍(二)如何使用事务_第2张图片

关闭可以这样写:

set autocommit=off;

或者

set autocommit=0;

这样的话,我们写入的多条语句就算是属于同一个事务了,直到我们显式的写出commit语句来把这个事务提交,或者显式的写出rollback语句来把这个事务回滚。

补充:Oracle默认不自动提交,需要手写commit命令,而Mysql默认自动提交。

隐式事务

数据定义语言(DDL)

数据库对象指的就是数据库、表、视图、存储过程等结构。当我们使用create、alter、drop等语句去修改数据库对象时就会隐式的提交前边语句所属于的事务。

数据库事务介绍(二)如何使用事务_第3张图片

隐式使用或修改mysql数据库中的表

当我们使用alter user、create  user、drop user、grant、rename user、revoke、set password等语句时也会隐式提交前面语句所属的事务。

事务控制或关于锁定的语句

①当我们在一个事务还没提交或回滚时就又使用start transaction或begin语句开启一个事务,会隐式提交上一个事务。

②当前的autocommit如果为off,此时如果我们手动将其修改为on也会隐式提交前面语句所在的事务。

③使用lock tables、unlock  tables等关于锁定的语句也会隐式提交前边语句所属事务。

 加载数据的语句

使用load data语句来批量往数据库中导入数据时也会隐式提交前边的事务。

关于mysql复制的一些语句

使用start  slave、stop slave、reset slave、change master to等语句时。

其他一些语句

使用 analyze table, cache index , check table , flush , load index into cache , optimize table , repair table , reset等语句也会隐式提交事务。

你可能感兴趣的:(Java开发,mysql,数据库,mysql,数据库架构,database,数据库开发)