大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
数据库事务
数据一旦提交,就不可回滚
那些操作会导致数据的自动提交?
- DDL操作一旦执行,都会自动提交
-. set autocommit = false不起作用 - DML默认情况下,一旦执行就会自动提交
-. 可以设置set autocommit = false - 关闭连接的时候会自动提交
Connection connection = DriverManager.getConnection(url, user, password);
connection.setAutoCommit(false);
String sql1 = "update user_table set balance = balance - 100";
update(connection,sql1,"AA");
String sql2 = "update user_table set balance = balance + 100"
update(connection,sql2,"BB");
connection.commit();
注意 若Connection没有被关闭,还有可能被重复使用,则需要恢复其自动提交状态。尤其是在使用数据库连接池技术的时候。
事务的ACID属性
- 原子性(Atomicity):原子性是值事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性(Consistency):事务必须是数据库从一个一致性状态变换到另外一个一致性状态
- 隔离性(Isolation):事务的隔离性是指一个事物的执行不能被其他事务干扰,即一个事物内部的操作及使用的数据对冰法的其他事务是隔离的,并发执行的各个事物之间不能相互干扰
- 持久性(Durability):持久性是指一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
数据库的并发问题
- 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时且无效的。
- 不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了
- 幻读:对于两个事务T1,T2,T1从一个表格中读取了一个字段,然后T2在该表格中插入了一些新的行,之后如果T1再次读取同一个表,就会多出几行。
四种隔离级别
java中的事务操作举例
Connection connection = DriverManager.getConnection(url, user, password);
//获取当前数据库的隔离级别
System.out.println(connection.getTransactionIsolation());
//设置数据库的隔离级别
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
connection.setAutoCommit(false);
String sql = "select user,password,balance = ? from user_table where user = ?";
User user = getInstance(connection,User.class,sql,"CC");
System.out.println();
Connection connection = DriverManager.getConnection(url, user, password);
connection.setAutoCommit(false);
String sql = "update user_table set balance = ? where user = ?";
update(connection,sql,5000,"CC");
Thread.sleep(15000);
System.out.println("修改结束");
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168940.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...