?什么是事务?
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。(比如银行转账)
简单来说,事务就是把多个操作合并成一个,一起去提交,要么都执行,要么都不执行。
事务的 4 大特性(ACID)
事务的四大特性是必须要知道的!!!!考试要考,不难很好理解
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
?并发事务引起的问题
事务并发一般会引起三种问题:脏读,不可重复读,幻读
-
脏读:一个事务读到另外一个事务还没有提交的数据。(同时开启多个事务,一个事务修改了数据,但还没有提交,但另一个事务读取到了修改的数据) -
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。(同时开启多个事务,事务A先查询了id为1的记录,发现此记录name值为"AAA",但同时事务B,修改了id为1的数据,把name改为了"BBB",并提交,这时事务A再次查询了id为1的记录,发现name值却变成了"BBB") -
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。(同时开启多个事务,事务A先查询了id为3的数据,发现没有,这时准备往里面添加数据,这时事务B也查询了了id为3的数据,发现没有,并往里面添加了id为3的数据,并提交。这时事务A开始往里面添加id为3的数据,却发现添加不进去,报出主键重复,但事务A又查询了id为3的数据,发现没有,却始终添加不进数据,感觉出现了幻觉。注意出现幻读代表已经解决了不可重复读)
事务的隔离级别
- 读未提交(Read uncommitted):啥都未解决,性能最好
- 读已提交(Read committed):只能解决脏读
- 可重复读(Repeatable Read MySql数据库默认):解决脏读,不可重复读
- 串行化(Serializable):啥都能解决,性能最差
|