事务的定义?
事务是数据库系统中执行过程中的一个逻辑单位,由一个有限的数据库操作部分构成.
解释:
1.这个逻辑单位实际上是数据库最小工作单元,不可再分.
2.有限的步骤就是说可能是一个sql或者多个sql的执行
事务的基本要素(ACID)
- 原子性(Atomicity):事务开始后所有操作,要么全部成功,要么全部失败
例如:A给B转账,A余额减少100,对应B增加100,这两个必须同时成功(提交事务)或失败(回滚事务).
- 一致性(Consistency):事务开始到结束的约束完整性没有被破坏.
例如,主键唯一约束,字段定义长度约束,这里约束是数据库本身层面的;
还有就是业务方面的约束,例如A给B转账,A余额减少100,对应B增加50,虽然保证了原子性,但是破坏了约束.导致数据前后不一致.
3.隔离性(Isolation),当有了多个事务之后,那么多个事务应当是完全隔离开来的,他们互不干扰.但是当多个事务同时操作一个数据时,也要保证事务的透明性
4.持久性(Durable),对数据库的操作,只要事务是成功的,那么结果就是永久性的,不可能因为其他原因导致数据不正确.例如当数据库宕机,持久性通过red log和double write双写缓冲来实现,我们操作数据的时候会写到内存中,同时也会记录redo log,如果再写入磁盘之前出异常,在重启之后就可以读取redo log的内容写入磁盘中,保证数据永久性.
事务并发带来的四个问题(脏读,不可重复读/幻读/数据丢失)
1.脏读(脏读脏读顾名思义是读出了问题,读了别人没有提交的数据)
假如小名明账户有100元,这里有两个事务A,B;在A事务查看账户时是100,然后这个时候B事务将100改成了200元,但是事务B还没提交,恰巧这时A又去看了自己账户发现钱变成了200元,如果这时候B回滚事务.那么读取的数据就是脏数据.这种现象总结下来就是A事务读取了B还没有提交的事务,称作脏读.
2不可重复读(多次读取同一个数据发现结果不一致)
在一次事务中的多次查询同一数据发现查询结果不一致.
3.幻读(两次查询结果发现条数不一致)
在一个事务中可能有人提交了新的数据,导致查询结果数据量不一致
4.数据丢失
两次更新操作可能会覆盖上一次数据的写入,导致数据丢失问题.
对于事务带来的问题的解决方案(四种隔离级别)
SQL标准定义了四种隔离级别:
Read Uncommitted(读取未提交内容)
在一个事务中,可以读取到其他事务未提交的数据变化,这种读取其他会话还没提交的事务,叫做脏读现象,在生产环境中切勿使用。
Read Committed(读取提交内容)
在一个事务中,可以读取到其他事务已经提交的数据变化,这种读取也就叫做不可重复读,因为两次同样的查询可能会得到不一样的结果。
Repeatable Read(可重读)
MySQL默认隔离级别,在一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读现象,但是它还是无法解决幻读问题。
Serializable(可串行化)
这是最高的隔离级别,它强制事务串行执行,避免了前面说的幻读现象,简单来说,它会在读取的每一行数据上都加锁,所以可能会导致大量的超时和锁争用问题。
目前mysql默认使用可重复读隔离级别.