数据库事务 原子性如何保证? 隔离性隔离级别?

数据库事务有ACID四种特性:

  • 原子性Atomicity:当前事务的操作要么同时成功,要么同时失败。原子性由undo log日志来保证
  • 一致性Consistency:使用事务的最终目的,由业务代码正确逻辑保证
  • 隔离性Isolation:在事务并发执行时,他们内部的操作不能互相干扰
  • 持久性Durability:一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来保证

关于原子性:
举例:假如事务内部有操作A,操作B。操作A执行成功,操作B失败,此时要保证事务原子性,即操作要同时失败(因为操作B已经失败了)。显然需要回滚操作A,那么如何回滚呢?
实际底层是这样实现的:假设操作A是insert语句,在执行的同时,会生成一条与insert语句相反的delete语句(delete语句能保证把insert语句插入的记录删掉),当需要回滚操作A时,只需要执行delete语句即可。

关于隔离级别:
InnoDB引擎中,定义了四种隔离级别供我们使用,级别越高事务隔离性越好,但性能就越低,而隔离性是由Mysql的各种MVCC机制来实现的

共有四种隔离级别:

  • read uncommit(读未提交)
  • read commit(读已提交)
  • repeatable read(可重复读)
  • serializable(串行)

设置隔离级别及事务相关sql语句:
set tx_isolation = ‘read-uncommitted’(设置隔离级别为读未提交)
begin;(开启事务)
xxxxx(增删改查sql语句)
rollback;(回滚事务)
commit;(提交事务)

关于四种隔离级别的详解:
read uncommit:
在事务A中,可以读到事务B中还未提交的操作

read commit:
在事务A中,读不到事务B中还未提交的操作,只能在事务已提交后,才能读到

repeatable read:
在同一个事务中,多次读取同一数据,读到的一定是相同的值

serializable:
所有的事务串行执行,对于操作相同记录的事务,当有其他事务执行时,当前事务需挂起等待。

你可能感兴趣的:(mysql,数据库,java,mysql,事务)