事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行
每个sql语句都是相互依赖的。简单的说就是一条船上的人,要生一起生要死一起死;
原子性:原子性是指事务是一个不可分割的工资单位,事务中的 *** 作要么都发生,要么都不发生;
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态;
隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的 *** 作使用的数据对并发的其他事务是隔离的,并发执行的各个事务间不能互相干扰;
持久性:是指一个事务一旦被提交,他对数据库中数据的改变就是永久性的
接下来的其他 *** 作和数据库故障不应该对其有任何影响
事务的并发问题
脏读:指一个线程中的事务读取到了另外一个线程中未提交的数据。比如:线程A读取了线程B更新前的数据,然后B回滚 *** 作,那么A读取到的数据是脏数据。
示例:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。 与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。 最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。
不可重复读:指一个线程中的事务读取到了另外一个线程中提交的update数据。具体来说:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该数据。那么,在第一个事务中两次读数据之间,有可能第二个事务对该数据做了修改,那么第一个事务两次读到的的数据就是不一样的。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
比如:线程 A 多次读取同一数据,线程B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
示例:
在事务A中,读取到张三的工资为5000, *** 作没有完成,事务还没提交。 与此同时, 事务B把张三的工资改为8000,并提交了事务。 随后,在事务A中,再次读取张三的工资,此时工资变为8000,两次读取到的结果不一致。
幻读:指一个线程中的事务读取到了另外一个线程中提交的insert的数据。就好像发生了幻觉一样,比如:明明当前事务查询没有这条结果,理应可以在当前事务进行新增 *** 作,但是却提示记录已存在不能插入相同主键记录,这就是幻读。再比如:第一个事务对表中的数据进行了全表update,同时,第二个事务向表中插入一行新数据。执行后,第一个事务的用户发现表中还有一条记录没有更新成功,就好象发生了幻觉一样,这也是幻读。
示例:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。 此时,事务B插入一条工资也为5000的记录。 这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)