MySQL-事务
Posted shengwangmei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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-事务的主要内容,如果未能解决你的问题,请参考以下文章