Mysql数据库事务

事务概念

事务:一组逻辑操作单元,使数据从一种状态转换到另一种状态
事务处理保证所有的事务都作为一个工作单元执行,即使出现了故障,都不能改变这种执行方式,当在一个事务中执行多个操作时,要么所有的事务都被提交,那么这些操作就 永远的保存下来,要么数据库系统放弃所做的所有修改,将整个事务回滚到最初的状态
为确保数据库中数据的一致性,数据的操纵应该是离散的成组的逻辑单元,当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务全部被归为错误操作,所有从最初开始的操作全部回退到最初的开始状态

事务处理

1.数据库一旦提交就不可以回滚
2.如何判断数据库已经提交
当一个连接对象被创建时,默认情况下是自动提交事务,每次执行一条sql语句时,如果执行成功,则向数据库自动提交,而不能回滚
关闭数据库连接,数据就会自动的提交,如果有多个操作,每个操作使用的是自己单独的连接,则无法保证事务,即同一个事务的多个操作必须在同一个连接下

处理方法

调用Connection对象中的setAutoCommit(false),取消事务的自动提交,在所有sql语句执行完之后调用对象中的commit();提交事务在出现异常时在处理异常的方法调用rollBack();方法,使事务回滚但最初状态

注意

如果Connection没有被关闭,还可能会被重复使用,则需要恢复自动提交状态调用setAutoCommit(true);在使用数据库连接池技术是,执行close()方法前建议恢复自动提交状态

事务的ACID属性

1原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2一致性(Consistency)
事务必须是数据库从一个一致性状态变换到另外一个一致性状态
3隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即事务内部的操作和使用的数据库不受其他事务影响
4持久性(Durability)
事务的持久性是指一个事务一旦被提交,则对数据库中的数据的改变将是永久性的,接下来的其他操作和故障将不会对其有任何影响

使用事务的过程中可能造成的问题

  • 脏读:在一个事务A中修改了数据,而在另一个事务B中使用的数据是事务A在修改之前的数据,那么B事务读取到的数据就是脏数据,也就是脏读,而脏读可能导致处理的最终结果不正确性
  • 丢失修改:在事务A中修改了数据,在事务B中也修改了数据,最终得到的数据为事务B所修改的数据,因此事务A丢失修改,所以称为丢失修改
  • 幻读:事务A在操作数据的时候增加或者删除了数据,而事务B在事务A增加或者删除之前查询了数据,又在修改之后查询了数据,发现两次查询的数据数量不一样就跟幻觉一样,因此称为幻读
  • 不可重复读:事务A在操作数据的时候修改数据,而事务B在事务A修改之前查询了该数据,修改之后又查询了该数据,发现两次读取到的数据不一致,这就导致了一个事务内两次读取结果不同,因此称为不可重复读
    幻读和不可重复读的区别:不可重复读的重点是修改,比如一个事务多次读取该数据,而另一个事务对其一些列数据进行了修改,而幻读是在原有的数据上增加或删除了一些,结果发现多次读取读到的数据数量不一致

Mysql的事务隔离级别

  • 读取未提交(READ-UNCOMMITTED):最低的隔离级别,允许读取未提交的数据,可能导致脏读,幻读,不可重复读
  • 读取已提交(READ-COMMITTED):允许读取事务已经提交的数据,可以避免脏读,但是幻读和不可重复度仍有可能发生
  • 可重复读(REPETABLE-READ):对同一字段的多次读取都是一致的 ,除非事务本身对数据进行了修改,可以避免脏读,不可重复读,但幻读仍有可能发生
  • SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读,不可重复度,幻读
    InnoDb默认支持事务隔离级别:REPETABLE-READ
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值