一,什么是事务
事务,指一组相互依赖的操作行为。只有事务中所有的操作成功,才意味着整个事务成功,只要有一个事务失败,就意味着整个事务失败。在数据库中,事务实际上是一组SQL语句,这些SQL语句通常会涉及到更新数据库中的数据操作。数据库系统会保证只要当事务执行成功时,才会永久保存事务对数据库所做的更新,如果事务执行失败,就会使数据库系统回滚到执行事务前的初始状态。
二,用实例说明
在现实生活中,假如小胡到银行办理转账事务,向把100元转到小李身上,那么必定有以下操作:从小胡身上减去100,小李身上加上100。
很显然,以上两个操作必须作为一个不可分割的整体。如果第一步小胡减去100执行成功,而第二步小李增加100执行失败,那么最终的结果就是整个事务失败。那么进行事务的回滚,就会回到最初始的状态。
而如果执行成功,那么数据库中比如存在执行事务的SQL语句
# 假设数据库中的表名为accounts update accounts set 小胡.money = 小胡.money - 100 where name = '小胡'; update accounts set 小李.money = 小李.money + 100 where name = '小李';
这两条 sql 语句只要有一条执行失败,那就必须退回到最初的状态。
当然如果这两条 sql 语句都执行成功,那么就表示整个事务成功
三,事务的特征
数据库事务必须具备 ACID 特征。分别表示原子性(Automic),一致性(Consistency),隔离性(Isolation),持久性(Durability)
原子性:指整个事务是不可分割的工作单元。只有事务中所有的操作执行成功,才能算整个事务执行成功;事务中的任何一个SQL语句执行失败,已经执行的SQL语句必须进行撤销,数据库的状态应该回到最原始的状态。
一致性:至数据库中不能破坏关系数据库的完整性以及业务逻辑的一致性。例如上面的银行转账,不过事务的成功与失败,应该保证事务结束后的总金额不变
隔离性:指在并发的环境中,当不同的事务同时操作相同的数据时,每个事务都有自己的完整的空间
持久性:只要数据库完整的结束,name数据库对更新的数据就必须做到永久的保存下来,及时生态系统发生奔溃,重新启动数据库之后,数据库还能恢复到事务成功结束时的状态
四,事务的管理者
事务的ACID特性是由关系数据库系统管理的,并且数据库中采用 日志 来保证事物的原子性,一致性和持久性。日志记录了事务对数据库的更新,如果某个事务在发生过程中出现错误,就可以根据日志,撤销事务对数据库已做的跟新,使数据库回到执行事务前的状态了。这里不得不说一下日志以及查看日志的重要性了。
当然事务的管理系统呢采用了锁的机制来实现事务的隔离性。假如有两个人同时去银行取钱,并取得是同一个用户的钱,那么后来的用户需要等待先来的用户操作完成才能再进行操作,否则假设不进行锁的机制而进行异步操作,那么就有可能操作两个都失败。例如两个人同时取这里面的1000块钱,如果不设置线程同步,那么既有可能两边都出现取出1000元,而用户的余额最终显示为 -1000 元,陷入这是不可能存在的结果。
因此当多个事务同时更新数据库的相同数据时,只允许持有锁的事务更新该数据,其他事物必须等待,直到前一个事务释放了锁,其他事物才有可能更新该数据!