Mysql事务详解(一)事务的概念,四大特性,使用和回滚
2016-06-01 13:31
671 查看
以往的时候在java中,下面一个语句就可以操作一条数据库语句
这就是一个事务,这一个事务代表了一个语句的链接,传输和运行。在默认上述的情况下这样的一个语句独占一个事务。
这样的操作有什么弊端呢?
如果你去银行转账,刚刚从自己卡里划了100元出去,要打给A,结果A还没有收到银行系统就崩溃了(假设情况),这样你这100元就丢掉了。如果从自己卡里扣钱和小A卡里加钱是一个事务的话,他们两个应该是一起执行,不然就一起没有执行。
这就是事务的四大特性
事务的四大特性ACID
A~原子性:事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。类似于一个CAS(compare and swap)(有时间会讲解cas)
C~一致性: 事务在执行前后数据的完整性保持不变。(例:原本的外键约束在进行事务成功后不会损坏)
D~隔离性:当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。
I~持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,不能再回滚。
那么我们怎么声明一个事务呢?
在数据库中我们这样使用
事务里还有一个特别有意思的事情就是回滚,可以返回上次的回滚点
下面是回滚点例子
当然我们还可以设置回滚点
<span style="font-family: Arial, Helvetica, sans-serif;">Class.forName("com.mysql.jdbc.Driver");//加载相应的字节码文件,把类加载到java虚拟机的方法区中(以后会详细讲解jvm的内存模型)</span>
conn = DriverManager.getConnection(url, user, password);//获取连接 stmt = conn.prepareStatement(sql);//准备执行语句那么接下来的一个执行代码就是一个事务
sql = "create table student(NO char(20),name varchar(20),primary key(NO))"; int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数,-1未成功
这就是一个事务,这一个事务代表了一个语句的链接,传输和运行。在默认上述的情况下这样的一个语句独占一个事务。
这样的操作有什么弊端呢?
如果你去银行转账,刚刚从自己卡里划了100元出去,要打给A,结果A还没有收到银行系统就崩溃了(假设情况),这样你这100元就丢掉了。如果从自己卡里扣钱和小A卡里加钱是一个事务的话,他们两个应该是一起执行,不然就一起没有执行。
这就是事务的四大特性
事务的四大特性ACID
A~原子性:事务的一组操作是原子的不可再分割的,这组操作要么同时完成要么同时不完成。类似于一个CAS(compare and swap)(有时间会讲解cas)
C~一致性: 事务在执行前后数据的完整性保持不变。(例:原本的外键约束在进行事务成功后不会损坏)
D~隔离性:当多个事务同时操作一个数据库时,可能存在并发问题,此时应保证各个事务要进行隔离,事务之间不能互相干扰。
I~持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,不能再回滚。
那么我们怎么声明一个事务呢?
在数据库中我们这样使用
start transaction; sql语句1; sql语句2; commit;这是在数据库中的使用,在JDBC环境下,由于jdbc自动提交事务,我们需要关闭自动提交事务
conn.setAutoCommit(false); sql=""; stmt.executeUpdate(sql); conn.commit();这样就完成了一次事务的提交,可以类比流,一直存在cache里,最后一次性flush;
事务里还有一个特别有意思的事情就是回滚,可以返回上次的回滚点
下面是回滚点例子
conn.setAutoCommit(false); stmt.execute(sql); conn.rollback();这样的情况下一旦调用rollback方法,这次的sql语句便失效了,即回滚到事务刚刚开始的时候
当然我们还可以设置回滚点
conn.setAutoCommit(false); stmt.execute(sql1); SavePoint sp = conn.setSavePoint(); stmt.execute(sql2); conn.rollback(sp<span style="font-family: Arial, Helvetica, sans-serif;">);</span>我们只要把保存的SavePoint当作参数传入rollback方法即可回滚到执行完sql1的位置,sql2失效。
相关文章推荐
- Mysql 只修改日期的年月日
- MySQL大小写不敏感的解决方法
- MYSQL知识点
- MySQL数据库之插入显示图片
- MySql日期查询语句解剖
- MySQL并发控制——事务与事务隔离级别详解
- mysql数据表操作&库操作
- mysql索引操作
- mysql变量
- mysql 事务隔离级别详解
- sql添加列,修改列,删除列(mysql/mssql)
- MySQL优化
- MySQL 存储过程参数用法 in, out, inout
- 欢迎使用CSDN-markdown编辑器
- MYSQL 基础整理
- MySQL grant命令使用
- 查看mysql数据库版本方法总结
- 【mysql】关于切分查询
- 【mysql】关联子查询的一种优化
- MySQL语句大全