什么是事务
事务(Transaction
)是数据库区别于文件系统的重要特性之一。
数据库引入事务的主要目的:事务会把数据库从一种抑制状态转换为另一种一致状态。在数据库提交工作时,这种机制能够保证在一组的sql语句要么都成功执行、要么都不执行。
事务的基本要素(ACID)
事务用来保证数据库的完整性
- 原子性(
atomicity
):事务中所有操作要么全部成功,要么全部失败 - 一致性(
consistency
):从一种状态转变为下一种一致状态。事务开始前和结束后,数据库的完整性约束没有被破坏。 - 隔离性(
isolation
):一个事务的影响在提交前对其他事务都不可见 - 持久性(
Durability
):一旦提交,结果就是永久性的。
InnoDB
中的事务完全符合ACID
的特性
数据库事务的隔离级别
数据库事务的隔离级别有4种,由低到高分别是:
- 未提交读(
Read uncommitted
) - 已提交读(
read committed
) - 可重复读(
repeatable read
) - 可串行化(
Serializable
)
未提交 读(Read uncommitted
)
允许脏读,就是一个事务可以读取另一个未提交事务的数据。
eg:
老板要给员工发工资,员工的工资是3000/月。但是发工资时老板不小心按错了数字,按成5000/月,但是该事务还没有提交,就在这时,员工去查看自己这个月的工资,发现(5000)比往常多了2千元,以为涨工资了非常高兴。
已提交读(read committed
)
只能读取到已经提交的数据(就是事务要等另一个事物提交后才能读取数据)
eg:
小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启),收费系统事先检测到他的卡里有3000,就在这个时候!!小明的对象把卡里的钱全部转了出去,并提交事物(提交完成)。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了。
可重复读(repeatable read
)
就是在开始读取数据(事物开启)时,不再允许修改操作。
eg:
小明拿着工资卡去超市购物(卡里当然是只有3000),当他卖单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3000。这个时候任何人不能转出金额了。接下来收费系统就可以扣款了。
可串行化(Serializable
)
最高的事务隔离级别,在该级别下,事务串行化顺序执行,读写相互都会阻塞。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不用。
eg:
小明拿着工资卡去ATM机(卡里当然是只有3000),当他取钱时(事务开启),ATM查询到他的卡里有3000。这个时候在向卡里存200。此时只有当查的事物完成时,存的事物才会执行。
总结
简单来说: 事物就是在数据库提交工作时,要么所有修改都保存,要么所有修改都不保存。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。