数据库事务

一、什么是事务

  数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
  简单的说:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。

二、事务的四大特性

事务的四大特性(ACID)是:
  (1)原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
  (2)一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号金额之和应该是不变的。
  (3)隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。例如:在A事务中,查看另一B事务(正在修改张三的账户金额)中张三的账户金额,要查看到B事务之前的张三的账户金额,要么查看到B事务之后张三的账户金额。
  (4)持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

三、MySQL中的事务

  在默认情况下,MySQL每执行一条SQL语句,都是一个单独的事务。如果需要在一个事务中包含多条SQL语句,那么需要开启事务和结束事务。

 -开启事务:start transaction;
 -结束事务:commit(提交事务)或rollback(回滚事务)。

  在执行SQL语句之前,先执行strat transaction,这就开启了一个事务(事务的起点),然后可以去执行多条SQL语句,最后要结束事务,commit表示提交,即事务中的多条SQL语句所做出的影响会持久化到数据库中。或者rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤消了。

四、事务并发读问题

  多个事务对相同的数据同时进行操作,这叫做事务并发。
  在事务并发时,如果没有采取必要的隔离措施,可能会导致各种并发问题,破坏数据的完整性等。这些问题中,其中有三类是读问题,分别是:脏读、不可重复读、幻读:
  (1)脏读(dirty read):读到另一个事务的未提交更新数据,即读取到了脏数据;
  (2)不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改(是针对修改操作)
  (3)幻读(虚读)(phantom read):对同一张表的两次查询不一致,因为另一事务插入了一条记录(是针对插入或删除操作);

五、事务隔离级别

  事务隔离级别分四个等级,在相同数据环境下,对数据执行相同的操作,设置不同的隔离级别,可能导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力也是不同的。
  1、READ UNCOMMITTED(读未提交数据)安全级别最低, 可能出现任何事务并发问题(比如脏读、不可以重复读、幻读等)性能最好(不使用!!)
  2、READ COMMITTED(读已提交数据)(Oracle默认)防止脏读,没有处理不可重复读,也没有处理幻读;性能比REPEATABLE READ好
  3、REPEATABLE READ(可重复读)(MySQL默认)防止脏读和不可重复读,不能处理幻读问题;性能比SERIALIZABLE好
  4、SERIALIZABLE(串行化)不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;性能最差;
  MySQL的默认隔离级别为REPEATABLE READ,即可以防止脏读和不可重复读。

六、设置隔离级别

1、MySQL查询当前的事务隔离级别

select @@tx_isolation;

2、MySQL设置事务隔离级别(了解)

(1) set tx_isolation='read-uncommitted'; 
安全性最差,容易出现脏读、不可重复读、幻觉读,但性能最高
(2) set tx_isolation='read-committed';
安全性一般,可防止脏读,但容易出现不可重复读、幻觉读
(3) set tx_isolation='repeatable-read';
安全性较好,可防止脏读、不可重复读,但是容易出现幻读
(4) set tx_isolation='serialiable';
安全性最好,可以防止一切事务并发问题,但是性能最差。

3、JDBC设置事务隔离界别

JDBC中通过Connection提供的方法设置事务隔离级别:
Connection. setTransactionIsolation(int level)
参数可选值如下:
Connection.TRANSACTION_READ_UNCOMMITTED		1(读未提交数据)
Connection.TRANSACTION_READ_COMMITTED		2(读已提交数据)
Connection.TRANSACTION_REPEATABLE_READ		4(可重复读)
Connection.TRANSACTION_SERIALIZABLE			8(串行化)
Connection.TRANSACTION_NONE					0(不使用事务)

提示:在开发中,一般情况下不需要修改事务隔离级别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值