概念
- 百度百科:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
- 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
操作
- start transaction :开启事务
- commit :提交事务
- rollback :回滚事务
事务通常以start transaction开启,如果事务中的所有操作都没有问题,那么会commit ,提交事务,一个事务结束,如果事务中一旦有操作出现异常,那么会rollback,回滚事务,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
事务运行的三种模式
- 自动提交事务:每条单独的语句都是一个事务,每个语句都隐含一个commit
- 显式事务:以start transaction 开始,以commit 或 rollback 结束。
- 隠式事务:在前一个事务完成时,新事务隐式启动,但每个事务仍以commit或rollback显示结束
注意隔离级别的设置只对当前链接有效。对于使用MySQL命令窗口而言,一个窗口就相当于一个链接,当前窗口设置的隔离级别只对当前窗口中的事务有效;对于JDBC操作数据库来说,一个Connection对象相当于一个链接,而对于Connection对象设置的隔离级别只对该Connection对象有效,与其他链接Connection对象无关。
查看和设置事务提交方式
- select @@autocommit;:查看:1代表自动化提交,0代表手动提交,mysql默认为1
- set @@autocommit=1;:设置
事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:当事务提交或者回滚后,数据库会持久化的保存数据。
- 一致性:事务操作前后,结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性:多个事务之间,相互独立,一个事务的执行不能被其他事务干扰。
查看和设置事务隔离级别
- select @@tx_isolation;:查看隔离级别
- set global transaction isolation level 级别字符串;:设置隔离级别
存在问题
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 不可重复读(虚读):同一个事务中,2次读取到的数据不一样
- 幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
隔离级别
- read uncommitted:读未提交:产生问题:脏读,不可重复读,幻读
- read committed:读已提交(Oracle默认):产生问题:不可重复读,幻读
- repeatable read:可重复读(MySQL默认):产生问题:幻读
- serializable:串行化:可以解决所有问题