当前位置: 首页 > 工具软件 > DTL > 使用案例 >

dtl文件java_数据库之DTL——数据事务语言 事务

谷梁子昂
2023-12-01

事务的定义

指一组相关的SQL操作,这组操作必须同时成功或者同时失败

我们所有的操作都是处在事务中的。

在数据库中,执行业务的基本单位是事务,不是某一条SQL。数据库在默认情况下,事务都是打开的,也就说它是一直处在事务中的,一个事务的结束,代表着下一个事务的开启。

执行commit或者rollback指令时,会结束当前事务。

作用:用来保证数据的平稳性和可预测性。

事务的四大特性(ACID)

atomic,原子性,事务是不可再分割的,要么同时成功,要么同时失败

consistency,一致性,事务一旦结束,内存中的数据和数据库中的数据是保持一致的

isolation,隔离性,事务之间互不干扰,一个事务的结束意味着下一个事务的开启

duration,持久性,事务一旦提交,则数据持久化到数据库中,永久保存

操作事务的命令

commit,提交事务

把事务中所有的数据持久化到磁盘中

rollback [TO 回滚点],回滚事务

把事务中所做的操作全部取消,回到初始状态

savepoint 回滚点,设置回滚点

事务回滚时,回到的起点

多事务的并发处理机制

原因:多个事务同时操作一个表中的同一行数据,如果这些操作是修改操作的话,就会产生并发问题,如果不处理,则会造成数据不一致的情况。

数据库可能产生的并发问题包括:

脏读

是指一个事务正在访问数据,并且对这个数据进行修改,而这种修改还没有提交到数据库中,而另一个事务也访问了这个数据,并且使用了这个数据。

解决方法:一个事务在修改数据时,该数据不能被其他事务访问

不可重复读

是指一个事务多次读取同一条记录,如果此时另一个事务也访问并且修改了该数据,则就会出现多次读取出现数据不一致的情况,原来的数据变成了不可重复读取的数据。

解决方法:只有在修改事务完全提交过后才可以读取到数据

幻读

是指一个事务修改表中的多行记录,但是此时另一个事务对该表格进行了插入数据的操作,则第一个事务会发现表格中会出现没有被修改的行,就像发生了幻觉一样。

解决方法:在一个事务提交数据之前,其他事务不能添加数据

补充

目前主流的数据库都是支持事务的,而且其中Oracle支持的最好。

一个事务不能读取到另一个事务还没有提交的数据。

DDL语句都会自动提交事务。

MYSQL默认情况下,DML语句是自动提交事务的;

ORACLE默认情况下,DML语句是手动提交事务的。

修改MYQL数据库自动提交模式:

1.[永久] 修改my.ini文件,在 [mysqld] 下添加autocommit=0,重启服务

2.[临时] 执行语句 set session autocommit=0; 仅对当前会话窗口有效

查看当前数据库事务提交模式:

show session variables like ‘autocommit’;

 类似资料: