update sperren bei client/server anwendung

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,
ich möchte eine Client/Server Anwendung programmieren, bei der einzelne Daten vom Client über den Server in eine MySQL Datenbank eingetragen werden.
Die Kommunikation zwischen Client und Server wollte ich mittels serialisierten Objekten machen, die ich übers Netzwerk übertrage.

Mein Problem:

Der Client soll zB neue Mitarbeiter in die MySQL Datenbank eintragen können. Dabei wollte ich abfragen, ob der hinzuzufügende Mitarbeiter bereits in der Datenbank eingtragen ist (um Duplikate zu vermeiden). Was ist aber, wenn ich die Abfrage starte, ob es den Mitarbeiter gibt, und in der zwischenzeit trägt ein anderer Client diesen Mitarbeiter ein? Also kann ich die Datenbank für eine gewisse Zeit sperren? Ich glaube es gibt einen Lock Mechanismus für MySQL Tabellen, allerdings weis ich nicht ob das das richtige ist.
Wie wird sowas normalerweise gelöst?
 
G

Guest

Gast
Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.BatchUpdateException;
import java.sql.SQLException;

public class MySQL {

	public void doTransaction(){
	int[] updateCounts = new int[10];

	try
	{
		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testTransaction",
         			"xxx", "xxx");
	
		try
		{
			conn.setAutoCommit( false );
       

			Statement stm = conn.createStatement();
			stm.addBatch( "INSERT INTO transaction (Name)VALUES ('xxx')" );
			stm.addBatch( "INSERT INTO transaction (Name) VALUES ('xd')");
                
			updateCounts = stm.executeBatch();
			System.out.println("Counts: "+updateCounts);
			stm.close();
			//conn.commit();
			conn.close();

       } 
		catch ( BatchUpdateException bue )
		{
			conn.rollback();
			System.out.println("BatchUpdateException");
			bue.printStackTrace();
		}

	}
	catch(SQLException sqle)
    {
       System.out.println("SQL Fehler");
    }
    catch(ClassNotFoundException cnfe)
    {
    	cnfe.printStackTrace();
       System.out.println("Die Klasse wurde nicht gefunden");
    }
}

}

mit obenstehenden code kann ich die Daten in die Datenbank eintragen. Ich habe die DB-Felder auf UNIQUE stehen, sodass keine Duplikate zulässsig sind. Wenn ich nun 2 neue Namen in die DB eintragen will, geht alles problemlos. Wenn aber ein Name schon vorhanden ist, erhalte ich die BatchUpdateExeption mit dem Hinweis 'Duplicate Key'. Das Problem ist aber, dass er den 2. Namen, der noch nicht in der DB steht, dort einträgt. Also geht doch das rollback nicht? Oder?
 
G

Guest

Gast
Ich hab hier ein 2. Beispiel für Transaktionen, das bei mir irgendwie auch nicht funktioniert.

Code:
import java.sql.*;
     
public class TransactionPairs {

	public static void main(String args[]) {
		  
		String url = "jdbc:mysql://localhost/testTransaction";
		Connection con = null;
		Statement stmt;
		PreparedStatement updateSales;
		PreparedStatement updateTotal;
		String updateString = "update COFFEES " +
						"set SALES = ? where COF_NAME like ?";
	
		String updateStatement = "update COFFEES " +
				"set TOTAL = TOTAL + ? where COF_NAME like ?";
		String query = "select COF_NAME, SALES, TOTAL from COFFEES";
	
		try {
			Class.forName("com.mysql.jdbc.Driver");

		} catch(java.lang.ClassNotFoundException e) {
			System.err.print("ClassNotFoundException: "); 
			System.err.println(e.getMessage());
		}

		try {
	
			con = DriverManager.getConnection(url, 
									 "xxx", "xxx");
	
			updateSales = con.prepareStatement(updateString);
			updateTotal = con.prepareStatement(updateStatement);
			int [] salesForWeek = {190, 150, 60, 155, 90};
			String [] coffees = {"Colombian", "French_Roast", 
								"Espresso", "Colombian_Decaf",
								"French_Roast_Decaf"};
			int len = coffees.length;
			con.setAutoCommit(false);
			for (int i = 0; i < len; i++) {
				updateSales.setInt(1, salesForWeek[i]);
				updateSales.setString(2, coffees[i]);
				updateSales.executeUpdate();
	
				updateTotal.setInt(1, salesForWeek[i]);
				updateTotal.setString(2, coffees[i]);
				updateTotal.executeUpdate();
				con.commit();
			}
	
			con.setAutoCommit(true);
	
			updateSales.close();
			updateTotal.close();
	
			stmt = con.createStatement();							
			ResultSet rs = stmt.executeQuery(query);
				
			while (rs.next()) {
				String c = rs.getString("COF_NAME");
				int s = rs.getInt("SALES");
				int t = rs.getInt("TOTAL");
				System.out.println(c + "     " +  s + "    " + t);
			}
	
			stmt.close();
			con.close();
	
		} catch(SQLException ex) {
			System.err.println("SQLException: " + ex.getMessage());
			if (con != null) {
				try {
					System.err.print("Transaction is being ");
					System.err.println("rolled back");
					con.rollback();
				} catch(SQLException excep) {
					System.err.print("SQLException: ");
					System.err.println(excep.getMessage());
				}
			}
		}	
	}
}

Wenn ich anstelle von 'set TOTAL' -> 'set TOTAL1' angebe, damit eine SQL_Exception kommt, wird das erste Prepared Statement trotzdem ausgeführt ('190' wird in das Feld 'SALES' eingetragen). Es steht zwar in der Exception: Transaction is being rolled back, das erste Statement wird aber nicht zurückgenommen, das zweite wird ja sowieso nicht eingetragen, da hier ja eine Exception ausgelöst wird.

Das ist doch nicht richtig so, oder? Könnte vieleicht jemand eines der beiden Scripte ausprobieren und schauen ob's bei euch geht?
Als DB verwende ich MySQL 5.0.22, OS Ubuntu 6.06
 
G

Guest

Gast
habs gelöst: der Tabellentyp 'InnoDB' muss eingestellt werden, da 'MyISAM' anscheinend keine Transaktionen ausführen kann.

Aber zu meinem eigentlichen Problem: wie kann ich verhindern, dass eine Tabelle von einem anderen Client upgedatet wird, während ich mit meinem Client ein update mache?

Ich kann natürlich einen Datensatz in die Tabelle einfügen und, sollte das Insert nicht funktionieren weil der Datensatz schon vorhanden ist, das Einfügen mittels Transaktion rückgängig machen. Aber ist das eine saubere Lösung? Ist es nicht besser die Tabelle für den Zeitpunkt des Updates exklusiv für meinen Client zu öffnen bzw für andere Clients zu sperren?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
OnDemand Select vs Update ins blaue, was ist teurer? Datenbankprogrammierung 11
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
M SQL-Statement SQL mit Java, Update Fehler Datenbankprogrammierung 1
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
OnDemand SQL-Statement Update mit innerjoin Datenbankprogrammierung 18
OnDemand Update table SET will nicht Datenbankprogrammierung 9
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
S JPA: update von Schlüsselwerten Datenbankprogrammierung 2
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
M Update Befehl Datenbankprogrammierung 1
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
M SQL-Statement Datentypen in Kriterienausdruck unverdräglich bei Update auf DB von Java aus Datenbankprogrammierung 0
M SQL UPDATE richtig anwenden BITTE um HILFE Datenbankprogrammierung 3
M SQL UPDATE führt zu JAVA Absturz Datenbankprogrammierung 6
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
S UPDATE user Datenbankprogrammierung 4
R Fehler 2601 trotz SQL-UPDATE ? Datenbankprogrammierung 2
B DB Update via batch Datenbankprogrammierung 3
H Update ganze zeile Datenbankprogrammierung 4
R sqlite UPDATE wirkt nicht aus Java Datenbankprogrammierung 7
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
D Error 1452: Cannot add or update a child row: a foreign key constraint fails Datenbankprogrammierung 15
D SQL Update auf eine Query möglich? Datenbankprogrammierung 4
5 Datenbank Update Datenbankprogrammierung 8
A Oracle Update Befehl in Datenbank anhand einer Schleife Datenbankprogrammierung 8
turmaline Oracle "Häppchenweises" Update durchführen Datenbankprogrammierung 4
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
D ArrayIndexOutOfBoundsException bei Update von JTable und Model Datenbankprogrammierung 13
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
J MyBatis - Update Problem Datenbankprogrammierung 4
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
I Derby/JavaDB Update Fehler Datenbankprogrammierung 4
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
N batch-Update wird nicht durchgeführt Datenbankprogrammierung 2
R MS Access mit Java Problem mit Update Statment Datenbankprogrammierung 13
1 On duplicate Key update Datenbankprogrammierung 3
M DB update geht einfach nicht Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
G MySQL Update Datenbankprogrammierung 5
M MySQL größere von zwei Zahlen in Update Statement Datenbankprogrammierung 2
T Update an SQL Tabelle ?! Datenbankprogrammierung 10
C MySQL Update funktioniert nicht Datenbankprogrammierung 11
C Update Table1 mit Relationship Table2 Datenbankprogrammierung 6
prakdi einzelnen SQL Eintrag finden der "update" enthält Datenbankprogrammierung 3
V Datenbank Update Datenbankprogrammierung 7
A update methode für datenbank Datenbankprogrammierung 2
M Hibernate: Insert statt Update Datenbankprogrammierung 8
E Update DB; Werte aus Feldern übernehmen Datenbankprogrammierung 5
H Batch Update/Insert Datenbankprogrammierung 4
E Insert oder Update- Prüfung Datenbankprogrammierung 3
H Datenbank Update Datenbankprogrammierung 3
J SQL Abfrage: Verschiedene Werte in einer Spalte mit einem Update Befehl? Datenbankprogrammierung 7
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
M Update mysql Fehler ?? Datenbankprogrammierung 4
T Problem beim Update in die Access DB Datenbankprogrammierung 9
R Update Time auslesen Datenbankprogrammierung 2
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
K Ist mein UPDATE fehlerhaft? Datenbankprogrammierung 3
G Update-Befehl Fehlerhaft ?? Datenbankprogrammierung 2
G Update Befehl funkt nicht. WARUM? Datenbankprogrammierung 5
S Update Problem Datenbankprogrammierung 3
M Insert Update usw. Datenbankprogrammierung 2
S CashedRowSet update - oder was mache ich falsch - Datenbankprogrammierung 6
B [SQL] UPDATE oder REPLACE INTO Befehl Datenbankprogrammierung 10
S Update mit null Datenbankprogrammierung 11
H UPDATE . Datenbankprogrammierung 3
S PostgreSQL SELECT/UPDATE etc. Datenbankprogrammierung 4
T Update-Frage Datenbankprogrammierung 11
Y Hibernate - Update bestimmter Spalten Datenbankprogrammierung 2
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
B Update funktioniert nicht Datenbankprogrammierung 8
R Update und Insert Gleichzeitig? Datenbankprogrammierung 2
K MsAccess immer beim zweiten Update java.sql.SQLException Datenbankprogrammierung 28
N Hibernate & hsqldb: Problem bei db-update Datenbankprogrammierung 7
T Problem beim Update vom Resultset + Firebird Datenbankprogrammierung 2
G Update Statement automatisch unterteilen lassen Datenbankprogrammierung 3
G ist hieran was falsch ? UPDATE Anweisung Datenbankprogrammierung 8
W Hibernate Update Problem Datenbankprogrammierung 3
A Syntaxfehler bei update. Datenbankprogrammierung 8
O Update-Problem mit Hibernate-Framework Datenbankprogrammierung 5
L Problem mit Update Datenbankprogrammierung 14
L UPDATE löst Exception aus Datenbankprogrammierung 6
G Problem mit Datums-Format bei UPDATE Datenbankprogrammierung 3
F Update mit Prepared Statements Datenbankprogrammierung 10
M HSQLDB .Script-Datei entfernen oder sperren Datenbankprogrammierung 18
T Einzelne Datenbankzeile schreibend sperren? Datenbankprogrammierung 11
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
M Zugriff für andere sperren Datenbankprogrammierung 11
G Lostupdate & Sperren in JDBC Datenbankprogrammierung 4
N SELECT: Datensatz sperren Datenbankprogrammierung 6
L Oracle SQL Inserts via Client vs SQL Datei via ScriptRunner Datenbankprogrammierung 6
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben