事务的定义
指一组相关的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’;