事务(Transaction)是数据库管理系统的概念。
事务具有四大基本特性:
1.原子性(Atomicity): 事务是一个原子操作单位,要么全部执行成功,要么全部失败回滚。即事务中的所有操作要么全部提交,要么全部回滚,不会出现部分操作成功,部分操作失败的情况。
2.一致性(Consistency): 事务执行前后,数据库从一个一致性状态转换到另一个一致性状态。事务的执行不会破坏数据库的完整性约束和业务规则,保证数据的正确性和一致性。
3.隔离性(Isolation): 事务的执行是相互隔离的,彼此互不干扰。多个事务并发执行时,每个事务看起来好像在独立地执行,不会产生互相干扰的效果。隔离级别可以根据需要选择,例如读未提交,读已提交,可重复读和串行化。
4.持久性(Durability): 一旦事务提交成功,其所做的修改将永久保存在数据库中,并且对于后续的事务和系统故障是可恢复的。即使发生系统崩溃或断电等异常情况,数据库也能够保持一致性,事务的结果不会丢失。
线程安全问题-数据不一致
- 数据不一致(Data Inconsistency):当多个线程同时访问和修改共享数据时,如果没有合适的同步措施,会导致数据的不一致性。例如,一个线程正在读取一个变量的值,而另一个线程正在修改该变量的值,这就可能导致读取到的数值是不准确的。
-
public class ThreadDemo implements Runnable{ @Override public void run(){ for(int i = 0; i < 10000; i++){ Main.num++; } } } class Main{ static int num = 0;//静态变量的特性 在内存中只存在一份 public static void main(String[] args) throws InterruptedException{ Thread t1 = new Thread (new ThreadDemo ()); Thread t2 = new Thread (new ThreadDemo ()); Thread t3 = new Thread (new ThreadDemo ()); t1.start (); t2.start (); t3.start (); // join 方法 : 等待当前线程执行完成再继续执行 t1.join (); t2.join (); t3.join (); System.out.println (num); } }
如何解决
在线程中原子性:不可被打断的操作 CPU执行时一定会执行完成的操作
eg: int i=0; i++; i=i+1
保证原子操作: 可以用锁
- ·锁的机制就是一个信号标识 0 1 ,当一个线程修改这个标志之后,其他线程就不会 操作这个变量了
- 只有原线程将标识修改回无锁的状态后,其他线程才可以来访问操作这个变量
public class ThreadDemo implements Runnable{
@Override
public void run(){
for(int i = 0; i < 10000; i++){
// 参数: 多个线程都可以看到的一个对象 监视器锁
synchronized (Main.lockObj){// 给需要原子操作的代码上锁 执行完成就会解锁
Main.num++;
}
}
}
}
class Main{
static int num = 0;//静态变量的特性 在内存中只存在一份
static Object lockObj = new Object();
public static void main(String[] args) throws InterruptedException{
Thread t1 = new Thread (new ThreadDemo ());
Thread t2 = new Thread (new ThreadDemo ());
Thread t3 = new Thread (new ThreadDemo ());
t1.start ();
t2.start ();
t3.start ();
// join 方法 : 等待当前线程执行完成再继续执行
t1.join ();
t2.join ();
t3.join ();
System.out.println (num);
}
}