码迷,mamicode.com
首页 > 数据库 > 详细

MySQL-事务

时间:2018-07-18 14:05:12      阅读:16      评论:0      收藏:0      [点我收藏+]

标签:事务   相关   单位   tab   code   包括   执行   实现   操作   

MySQL-事务

一、什么是事务

  MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。

  举一个简单的例子:银行转账事务。A要给B转账10000元人民币,要实现的操作包括:

  - 操作1:A账户中减去10000元;

  - 操作2:B账户中增加10000元。

  如果银行系统A完成了减去1000元的操作,这时系统出现问题,没有给B账户进行增加1000元的操作。很明显,这种操作是存在极大的风险的。在这个事务中,要么事务中的多个操作都成功,要么都失败,不能出现某些操作成功,而某些操作失败的情况。即:操作1和操作2都成功,完成转账;或者操作1和操作2都失败,转账失败。


二、事务的四大特性(ACID)
  由上面的例子,我们很容易就可以总结出事务的四大特性。
  1. 原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
  2. 一致性 (Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。其他特性都是服务于一致性。
  3. 隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
  4. 持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。


三、事务隔离级别
1. SQL中定义了4中隔离级别。

  • SERIALIZABLE(串行化)
      不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的,性能最差;
  • REPEATABLE READ (可重复读)(MySQL)
      防止脏读和不可重复读,不能处理幻读问题;
      性能比SERIALIZABLE好。
  • READ COMMITTED (读已提交数据)(Oracle)
      防止脏读,没有处理不可重复读,也没有处理幻读;
      性能比REPEATABLE READ好。
  • READ UNCOMMITTED (读未提交数据):脏读
      即使没有提交,对其他事务也都是可见的。
      可能出现任何事务并发问题;
      性能最好。

2. MySQL中默认的隔离级别为Repeatable read

select @@tx_isolation //可以通过这个语句进行查看
set transaction isolationlevel  //可以通过这个语句进行设置隔离级别

3. JDBC设置隔离级别

con. setTransactionIsolation(int level)

参数可选值如下:

Connection.TRANSACTION_READ_UNCOMMITTED;
Connection.TRANSACTION_READ_COMMITTED;
Connection.TRANSACTION_REPEATABLE_READ;
Connection.TRANSACTION_SERIALIZABLE。

四、 MySQL中的事务
  MySQL中默认每一条SQL语句代表一个事务。但是如果一个事务中包含多个语句,那么需要进行开始事务和结束事务的操作。
  我们以银行转账为例,
SELECT * FROM account1;
          技术分享图片

  (1)事务的开始和提交操作:COMMIT
START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
UPDATE account SET balance=balance+10000 WHERE id=2;
COMMIT;
          技术分享图片

  (2)事务的回滚操作:ROLLBACK,执行完回滚操作后,此时的事务回滚至起点,即未进行操作。
START TRANSACTION;
UPDATE account SET balance=balance-10000 WHERE id=1;
UPDATE account SET balance=balance+10000 WHERE id=2;
ROLLBACK ;

MySQL-事务

标签:事务   相关   单位   tab   code   包括   执行   实现   操作   

原文地址:https://www.cnblogs.com/shengwangmei/p/9328398.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!